// Copyright 2019 The Chromium OS 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 ARC_VM_LIBVDA_ENCODE_WRAPPER_H_
#define ARC_VM_LIBVDA_ENCODE_WRAPPER_H_

#include <stdint.h>

#include <memory>

#include <base/files/scoped_file.h>
#include <base/macros.h>

#include "arc/vm/libvda/event_pipe.h"
#include "arc/vm/libvda/libvda_encode.h"

namespace arc {

// VeaContext is the encode session context created by VeaImpl.
// Implementations should be able to handle method invocations on any thread.
class VeaContext {
 public:
  VeaContext();
  virtual ~VeaContext();

  // Encodes the frame pointed to by |fd|.
  virtual int Encode(vea_input_buffer_id_t input_buffer_id,
                     base::ScopedFD fd,
                     size_t num_planes,
                     video_frame_plane_t* planes,
                     uint64_t timestamp,
                     bool force_keyframe) = 0;

  // Provides an output buffer for use by the internal encoder
  // implementation. Encoded frames will be placed at the buffer specified
  // by |fd|. |offset| should specify the offset at the buffer to start
  // placing the encoded content and |size| should specify the buffer size.
  virtual int UseOutputBuffer(vea_output_buffer_id_t output_buffer_id,
                              base::ScopedFD fd,
                              uint32_t offset,
                              uint32_t size) = 0;

  // Requests a change to encoding parameters.
  // The return value will be 0 when the param change request has been
  // successfully sent, and non-zero otherwise.
  virtual int RequestEncodingParamsChange(uint32_t bitrate,
                                          uint32_t framerate) = 0;

  // Requests to flush the encode session.
  virtual int Flush() = 0;

  // Returns the read-only endpoint of the event pipe file descriptor.
  int GetEventFd();

 protected:
  // Dispatch a REQUIRE_INPUT_BUFFERS event to the event pipe.
  void DispatchRequireInputBuffers(uint32_t input_count,
                                   uint32_t input_frame_width,
                                   uint32_t input_frame_height,
                                   uint32_t output_buffer_size);

  // Dispatch a PROCESSED_INPUT_BUFFER event to the event pipe.
  void DispatchProcessedInputBuffer(vea_input_buffer_id_t input_buffer_id);

  // Dispatch a PROCESSED_OUTPUT_BUFFER event to the event pipe.
  void DispatchProcessedOutputBuffer(vea_output_buffer_id_t output_buffer_id,
                                     uint32_t payload_size,
                                     bool key_frame,
                                     int64_t timestamp);

  // Dispatch a FLUSH_RESPONSE event to the event pipe.
  void DispatchFlushResponse(bool flush_done);

  // Dispatch a NOTIFY_ERROR event to the event pipe.
  void DispatchNotifyError(vea_error_t error);

 private:
  void WriteEvent(const vea_event_t& event);

  EventPipe event_pipe_;

  DISALLOW_COPY_AND_ASSIGN(VeaContext);
};

// VeaImpl encapsulates a VEA implementation that can be used to create encode
// sessions.
class VeaImpl {
 public:
  VeaImpl();
  virtual ~VeaImpl();

  // Returns the encoding capabilities of this implementation.
  // The returned vea_capabilities_t object is owned by VeaImpl.
  virtual const vea_capabilities_t* const GetCapabilities();

  // Initializes a new encode session and returns a new encode session context.
  virtual VeaContext* InitEncodeSession(vea_config_t* config) = 0;

  // Closes an open encode session.
  virtual void CloseEncodeSession(VeaContext* ctx) = 0;

 protected:
  vea_capabilities_t capabilities_;

  DISALLOW_COPY_AND_ASSIGN(VeaImpl);
};

}  // namespace arc

#endif  // ARC_VM_LIBVDA_ENCODE_WRAPPER_H_
