#pragma once
#include "mp4.h"

namespace MP4 {
  struct sidxReference {
    bool referenceType;
    uint32_t referencedSize;
    uint32_t subSegmentDuration;
    bool sapStart;
    uint8_t sapType;
    uint32_t sapDeltaTime;
  };

  class SIDX: public fullBox {
    public:
      SIDX();
      void setReferenceID(uint32_t newReferenceID);
      uint32_t getReferenceID();
      void setTimescale(uint32_t newTimescale);
      uint32_t getTimescale();

      void setEarliestPresentationTime(uint64_t newEarliestPresentationTime);
      uint64_t getEarliestPresentationTime();
      void setFirstOffset(uint64_t newFirstOffset);
      uint64_t getFirstOffset();

      uint16_t getReferenceCount();
      void setReference(sidxReference & newRef, size_t index);
      sidxReference getReference(size_t index);

      std::string toPrettyString(uint32_t indent = 0);
  };

  class TFDT: public fullBox {
    public:
      TFDT();
      void setBaseMediaDecodeTime(uint64_t newBaseMediaDecodeTime);
      uint64_t getBaseMediaDecodeTime();

      std::string toPrettyString(uint32_t indent = 0);
  };

  class IODS: public fullBox {
    public:
      IODS();
      void setIODTypeTag(char value);
      char getIODTypeTag();

      void setDescriptorTypeLength(char length);
      char getDescriptorTypeLength();

      void setODID(short id);
      short getODID();

      void setODProfileLevel(char value);
      char getODProfileLevel();

      void setODSceneLevel(char value);
      char getODSceneLevel();

      void setODAudioLevel(char value);
      char getODAudioLevel();

      void setODVideoLevel(char value);
      char getODVideoLevel();

      void setODGraphicsLevel(char value);
      char getODGraphicsLevel();

      std::string toPrettyString(uint32_t indent = 0);
  };
}