#ifndef ANDROID_DVR_BUFFERHUBD_BUFFER_NODE_H_
#define ANDROID_DVR_BUFFERHUBD_BUFFER_NODE_H_

#include <private/dvr/buffer_hub_metadata.h>
#include <private/dvr/ion_buffer.h>

namespace android {
namespace dvr {

class BufferNode {
 public:
  // Creates a BufferNode from existing IonBuffers, i.e. creating from an
  // existing ProducerChannel.
  BufferNode(IonBuffer buffer, size_t user_metadata_size);

  // Allocates a new BufferNode.
  BufferNode(uint32_t width, uint32_t height, uint32_t layer_count,
             uint32_t format, uint64_t usage, size_t user_metadata_size);

  // Returns whether the object holds a valid graphic buffer.
  bool IsValid() const { return buffer_.IsValid() && metadata_.IsValid(); }

  size_t user_metadata_size() const { return metadata_.user_metadata_size(); }
  uint64_t active_buffer_bit_mask() const { return active_buffer_bit_mask_; }
  void set_buffer_state_bit(uint64_t buffer_state_bit) {
    active_buffer_bit_mask_ |= buffer_state_bit;
  }

  // Accessor of the IonBuffer.
  IonBuffer& buffer() { return buffer_; }
  const IonBuffer& buffer() const { return buffer_; }

  // Accessor of the metadata.
  const BufferHubMetadata& metadata() const { return metadata_; }

 private:
  // Gralloc buffer handles.
  IonBuffer buffer_;
  BufferHubMetadata metadata_;

  // All active buffer bits. Valid bits are the lower 63 bits, while the
  // highest bit is reserved for the exclusive writing and should not be set.
  uint64_t active_buffer_bit_mask_ = 0ULL;
};

}  // namespace dvr
}  // namespace android

#endif  // ANDROID_DVR_BUFFERHUBD_BUFFER_NODE_H_
