// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef STARBOARD_RASPI_SHARED_OPEN_MAX_OPEN_MAX_COMPONENT_H_
#define STARBOARD_RASPI_SHARED_OPEN_MAX_OPEN_MAX_COMPONENT_H_

#include <queue>
#include <vector>

#include "starboard/common/log.h"
#include "starboard/common/mutex.h"
#include "starboard/raspi/shared/open_max/open_max_component_base.h"
#include "starboard/shared/internal_only.h"

namespace starboard {
namespace raspi {
namespace shared {
namespace open_max {

class OpenMaxComponent : protected OpenMaxComponentBase {
 public:
  enum DataType {
    kDataNonEOS,  // Do not flag any buffer as end of stream.
    kDataEOS,     // Flag the last buffer written as end of stream.
  };

  explicit OpenMaxComponent(const char* name);

  // Create a tunnel from this component's output to the specified component's
  // input port.
  void SetOutputComponent(OpenMaxComponent* component);

  // Flush and close the tunnel to the output component(s) (if any). This will
  // close all tunnels for components in the output chain. It must only be
  // called for the first component in the output chain.
  void CloseTunnel();

  void Start();
  void Flush();

  // Write data to the input buffer. Returns the number of bytes written or
  // -1 if an error occurred.
  // This will return immediately once no more buffers are available.
  int WriteData(const void* data, int size, DataType type, int64_t timestamp);

  // Write an empty buffer that is flagged as the end of the input stream.
  // This will block until a buffer is available.
  bool WriteEOS();

  // Try to get the next output buffer.  The function may enable the output port
  // internally if the output port has never been enabled or if the output
  // format has been changed.  In both case it enables the output port in
  // response to an output setting change.
  // If an output tunnel has been established, then this will GetOutputBuffer()
  // from the output component.
  OMX_BUFFERHEADERTYPE* GetOutputBuffer();
  void DropOutputBuffer(OMX_BUFFERHEADERTYPE* buffer);

  // Callbacks available to children.
  void OnErrorEvent(OMX_U32 data1, OMX_U32 data2, OMX_PTR event_data) override;
  virtual bool OnEnableInputPort(OMXParamPortDefinition* port_definition) {
    return false;
  }
  virtual bool OnEnableOutputPort(OMXParamPortDefinition* port_definition) {
    return false;
  }

 protected:
  ~OpenMaxComponent();

  // Allow control of buffer allocation.
  virtual OMX_BUFFERHEADERTYPE* AllocateBuffer(int port,
                                               int index,
                                               OMX_U32 size);

 private:
  void DisableOutputPort();

  void EnableInputPortAndAllocateBuffers();
  void EnableOutputPortAndAllocateBuffer();
  void EnableOutputTunnelling(const OMXParamPortDefinition& port_definition);
  OMX_BUFFERHEADERTYPE* GetUnusedInputBuffer();

  // Callbacks not intended to be overridden by children.
  void OnOutputSettingChanged() override;
  OMX_ERRORTYPE OnEmptyBufferDone(OMX_BUFFERHEADERTYPE* buffer) override;
  void OnFillBufferDone(OMX_BUFFERHEADERTYPE* buffer) override;

  Mutex mutex_;
  bool output_setting_changed_;
  std::vector<OMX_BUFFERHEADERTYPE*> input_buffers_;
  std::queue<OMX_BUFFERHEADERTYPE*> free_input_buffers_;
  std::vector<OMX_BUFFERHEADERTYPE*> output_buffers_;
  std::queue<OMX_BUFFERHEADERTYPE*> filled_output_buffers_;
  int outstanding_output_buffers_;

  OpenMaxComponent* output_component_;
};

}  // namespace open_max
}  // namespace shared
}  // namespace raspi
}  // namespace starboard

#endif  // STARBOARD_RASPI_SHARED_OPEN_MAX_OPEN_MAX_COMPONENT_H_
