#include "ebml.h"
#include "socket.h"
#include "bitfields.h"
#include "dtsc.h"

namespace EBML{
  static void sendUniInt(Socket::Connection &C, const uint64_t val);
  void sendElemHead(Socket::Connection &C, uint32_t ID, const uint64_t size);
  void sendElemUInt(Socket::Connection &C, uint32_t ID, const uint64_t val);
  void sendElemID(Socket::Connection &C, uint32_t ID, const uint64_t val);
  void sendElemDbl(Socket::Connection &C, uint32_t ID, const double val);
  void sendElemStr(Socket::Connection &C, uint32_t ID, const std::string &val);
  void sendElemEBML(Socket::Connection &C, const std::string &doctype);
  void sendElemInfo(Socket::Connection &C, const std::string &appName, double duration);
  uint32_t sizeElemEBML(const std::string &doctype);
  uint32_t sizeElemInfo(const std::string &appName, double duration);

  void sendElemSeek(Socket::Connection &C, uint32_t ID, uint64_t bytePos);
  uint32_t sizeElemSeek(uint32_t ID, uint64_t bytePos);
  void sendElemCuePoint(Socket::Connection &C, uint64_t time, uint64_t track, uint64_t clusterPos, uint64_t relaPos);
  uint32_t sizeElemCuePoint(uint64_t time, uint64_t track, uint64_t clusterPos, uint64_t relaPos);

  uint8_t sizeUInt(const uint64_t val);
  uint32_t sizeElemHead(uint32_t ID, const uint64_t size);
  uint32_t sizeElemUInt(uint32_t ID, const uint64_t val);
  uint32_t sizeElemID(uint32_t ID, const uint64_t val);
  uint32_t sizeElemDbl(uint32_t ID, const double val);
  uint32_t sizeElemStr(uint32_t ID, const std::string &val);

  void sendSimpleBlock(Socket::Connection &C, DTSC::Packet & pkt, uint64_t clusterTime, bool forceKeyframe = false);
  uint32_t sizeSimpleBlock(uint64_t trackId, uint32_t dataSize);
}