#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);
  };
}// namespace MP4