Restyle
This commit is contained in:
		
							parent
							
								
									5b79f296d6
								
							
						
					
					
						commit
						fccf66fba2
					
				
					 280 changed files with 56975 additions and 71885 deletions
				
			
		
							
								
								
									
										727
									
								
								lib/dtsc.h
									
										
									
									
									
								
							
							
						
						
									
										727
									
								
								lib/dtsc.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2,16 +2,16 @@
 | 
			
		|||
/// Holds all headers for DDVTECH Stream Container parsing/generation.
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <stdint.h> //for uint64_t
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <deque>
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <stdio.h> //for FILE
 | 
			
		||||
#include "json.h"
 | 
			
		||||
#include "socket.h"
 | 
			
		||||
#include "timing.h"
 | 
			
		||||
#include <deque>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <stdint.h> //for uint64_t
 | 
			
		||||
#include <stdio.h>  //for FILE
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#define DTSC_INT 0x01
 | 
			
		||||
#define DTSC_STR 0x02
 | 
			
		||||
| 
						 | 
				
			
			@ -19,187 +19,179 @@
 | 
			
		|||
#define DTSC_ARR 0x0A
 | 
			
		||||
#define DTSC_CON 0xFF
 | 
			
		||||
 | 
			
		||||
//Increase this value every time the DTSH file format changes in an incompatible way
 | 
			
		||||
//Changelog:
 | 
			
		||||
// Increase this value every time the DTSH file format changes in an incompatible way
 | 
			
		||||
// Changelog:
 | 
			
		||||
//  Version 0-2: Undocumented changes
 | 
			
		||||
//  Version 3: switched to bigMeta-style by default, Parts layout switched from 3/2/4 to 3/3/3 bytes
 | 
			
		||||
//  Version 4: renamed bps to maxbps (peak bit rate) and added new value bps (average bit rate)
 | 
			
		||||
#define DTSH_VERSION 4
 | 
			
		||||
 | 
			
		||||
namespace DTSC {
 | 
			
		||||
namespace DTSC{
 | 
			
		||||
 | 
			
		||||
  ///\brief This enum holds all possible datatypes for DTSC packets.
 | 
			
		||||
  enum datatype {
 | 
			
		||||
    AUDIO, ///< Stream Audio data
 | 
			
		||||
    VIDEO, ///< Stream Video data
 | 
			
		||||
    META, ///< Stream Metadata
 | 
			
		||||
    PAUSEMARK, ///< Pause marker
 | 
			
		||||
  enum datatype{
 | 
			
		||||
    AUDIO,          ///< Stream Audio data
 | 
			
		||||
    VIDEO,          ///< Stream Video data
 | 
			
		||||
    META,           ///< Stream Metadata
 | 
			
		||||
    PAUSEMARK,      ///< Pause marker
 | 
			
		||||
    MODIFIEDHEADER, ///< Modified header data.
 | 
			
		||||
    INVALID ///< Anything else or no data available.
 | 
			
		||||
    INVALID         ///< Anything else or no data available.
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  extern char Magic_Header[]; ///< The magic bytes for a DTSC header
 | 
			
		||||
  extern char Magic_Packet[]; ///< The magic bytes for a DTSC packet
 | 
			
		||||
  extern char Magic_Header[];  ///< The magic bytes for a DTSC header
 | 
			
		||||
  extern char Magic_Packet[];  ///< The magic bytes for a DTSC packet
 | 
			
		||||
  extern char Magic_Packet2[]; ///< The magic bytes for a DTSC packet version 2
 | 
			
		||||
  extern char Magic_Command[]; ///< The magic bytes for a DTCM packet
 | 
			
		||||
 | 
			
		||||
  ///\brief A simple structure used for ordering byte seek positions.
 | 
			
		||||
  struct seekPos {
 | 
			
		||||
  struct seekPos{
 | 
			
		||||
    ///\brief Less-than comparison for seekPos structures.
 | 
			
		||||
    ///\param rhs The seekPos to compare with.
 | 
			
		||||
    ///\return Whether this object is smaller than rhs.
 | 
			
		||||
    bool operator < (const seekPos & rhs) const {
 | 
			
		||||
      if (seekTime < rhs.seekTime) {
 | 
			
		||||
    bool operator<(const seekPos &rhs) const{
 | 
			
		||||
      if (seekTime < rhs.seekTime){
 | 
			
		||||
        return true;
 | 
			
		||||
      } else {
 | 
			
		||||
        if (seekTime == rhs.seekTime) {
 | 
			
		||||
          if (trackID < rhs.trackID) {
 | 
			
		||||
            return true;
 | 
			
		||||
          }
 | 
			
		||||
      }else{
 | 
			
		||||
        if (seekTime == rhs.seekTime){
 | 
			
		||||
          if (trackID < rhs.trackID){return true;}
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    long long unsigned int seekTime;///< Stores the timestamp of the DTSC packet referenced by this structure.
 | 
			
		||||
    long long unsigned int bytePos;///< Stores the byteposition of the DTSC packet referenced by this structure.
 | 
			
		||||
    unsigned int trackID;///< Stores the track the DTSC packet referenced by this structure is associated with.
 | 
			
		||||
    long long unsigned int seekTime; ///< Stores the timestamp of the DTSC packet referenced by this structure.
 | 
			
		||||
    long long unsigned int bytePos; ///< Stores the byteposition of the DTSC packet referenced by this structure.
 | 
			
		||||
    unsigned int trackID; ///< Stores the track the DTSC packet referenced by this structure is associated with.
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  enum packType {
 | 
			
		||||
    DTSC_INVALID,
 | 
			
		||||
    DTSC_HEAD,
 | 
			
		||||
    DTSC_V1,
 | 
			
		||||
    DTSC_V2,
 | 
			
		||||
    DTCM
 | 
			
		||||
  };
 | 
			
		||||
  enum packType{DTSC_INVALID, DTSC_HEAD, DTSC_V1, DTSC_V2, DTCM};
 | 
			
		||||
 | 
			
		||||
  /// This class allows scanning through raw binary format DTSC data.
 | 
			
		||||
  /// It can be used as an iterator or as a direct accessor.
 | 
			
		||||
  class Scan {
 | 
			
		||||
    public:
 | 
			
		||||
      Scan();
 | 
			
		||||
      Scan(char * pointer, size_t len);
 | 
			
		||||
      operator bool() const;
 | 
			
		||||
      std::string toPrettyString(size_t indent = 0) const;
 | 
			
		||||
      bool hasMember(const std::string & indice) const;
 | 
			
		||||
      bool hasMember(const char * indice, size_t ind_len) const;
 | 
			
		||||
      Scan getMember(const std::string & indice) const;
 | 
			
		||||
      Scan getMember(const char * indice) const;
 | 
			
		||||
      Scan getMember(const char * indice, size_t ind_len) const;
 | 
			
		||||
      void nullMember(const std::string & indice);
 | 
			
		||||
      void nullMember(const char * indice, size_t ind_len);
 | 
			
		||||
      Scan getIndice(size_t num) const;
 | 
			
		||||
      std::string getIndiceName(size_t num) const;
 | 
			
		||||
      size_t getSize() const;
 | 
			
		||||
  class Scan{
 | 
			
		||||
  public:
 | 
			
		||||
    Scan();
 | 
			
		||||
    Scan(char *pointer, size_t len);
 | 
			
		||||
    operator bool() const;
 | 
			
		||||
    std::string toPrettyString(size_t indent = 0) const;
 | 
			
		||||
    bool hasMember(const std::string &indice) const;
 | 
			
		||||
    bool hasMember(const char *indice, size_t ind_len) const;
 | 
			
		||||
    Scan getMember(const std::string &indice) const;
 | 
			
		||||
    Scan getMember(const char *indice) const;
 | 
			
		||||
    Scan getMember(const char *indice, size_t ind_len) const;
 | 
			
		||||
    void nullMember(const std::string &indice);
 | 
			
		||||
    void nullMember(const char *indice, size_t ind_len);
 | 
			
		||||
    Scan getIndice(size_t num) const;
 | 
			
		||||
    std::string getIndiceName(size_t num) const;
 | 
			
		||||
    size_t getSize() const;
 | 
			
		||||
 | 
			
		||||
      char getType() const;
 | 
			
		||||
      bool asBool() const;
 | 
			
		||||
      int64_t asInt() const;
 | 
			
		||||
      std::string asString() const;
 | 
			
		||||
      void getString(char *& result, size_t & len) const;
 | 
			
		||||
      JSON::Value asJSON() const;
 | 
			
		||||
    private:
 | 
			
		||||
      char * p;
 | 
			
		||||
      size_t len;
 | 
			
		||||
    char getType() const;
 | 
			
		||||
    bool asBool() const;
 | 
			
		||||
    int64_t asInt() const;
 | 
			
		||||
    std::string asString() const;
 | 
			
		||||
    void getString(char *&result, size_t &len) const;
 | 
			
		||||
    JSON::Value asJSON() const;
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    char *p;
 | 
			
		||||
    size_t len;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /// DTSC::Packets can currently be three types:
 | 
			
		||||
  /// DTSC_HEAD packets are the "DTSC" header string, followed by 4 bytes len and packed content.
 | 
			
		||||
  /// DTSC_V1 packets are "DTPD", followed by 4 bytes len and packed content.
 | 
			
		||||
  /// DTSC_V2 packets are "DTP2", followed by 4 bytes len, 4 bytes trackID, 8 bytes time, and packed content.
 | 
			
		||||
  /// The len is always without the first 8 bytes counted.
 | 
			
		||||
  class Packet {
 | 
			
		||||
    public:
 | 
			
		||||
      Packet();
 | 
			
		||||
      Packet(const Packet & rhs);
 | 
			
		||||
      Packet(const char * data_, unsigned int len, bool noCopy = false);
 | 
			
		||||
      virtual ~Packet();
 | 
			
		||||
      void null();
 | 
			
		||||
      void operator = (const Packet & rhs);
 | 
			
		||||
      operator bool() const;
 | 
			
		||||
      packType getVersion() const;
 | 
			
		||||
      void reInit(Socket::Connection & src);
 | 
			
		||||
      void reInit(const char * data_, unsigned int len, bool noCopy = false);
 | 
			
		||||
      void genericFill(long long packTime, long long packOffset, long long packTrack, const char * packData, long long packDataSize, uint64_t packBytePos, bool isKeyframe, int64_t bootMsOffset = 0);
 | 
			
		||||
      void appendData(const char * appendData, uint32_t appendLen);
 | 
			
		||||
      void getString(const char * identifier, char *& result, size_t & len) const;
 | 
			
		||||
      void getString(const char * identifier, std::string & result) const;
 | 
			
		||||
      void getInt(const char * identifier, uint64_t & result) const;
 | 
			
		||||
      uint64_t getInt(const char * identifier) const;
 | 
			
		||||
      void getFlag(const char * identifier, bool & result) const;
 | 
			
		||||
      bool getFlag(const char * identifier) const;
 | 
			
		||||
      bool hasMember(const char * identifier) const;
 | 
			
		||||
      void appendNal(const char * appendData, uint32_t appendLen);
 | 
			
		||||
      void upgradeNal(const char * appendData, uint32_t appendLen);
 | 
			
		||||
      void setKeyFrame(bool kf);
 | 
			
		||||
      virtual uint64_t getTime() const;
 | 
			
		||||
      void setTime(uint64_t _time);
 | 
			
		||||
      void nullMember(const std::string & memb);
 | 
			
		||||
      size_t getTrackId() const;
 | 
			
		||||
      char * getData() const;
 | 
			
		||||
      size_t getDataLen() const;
 | 
			
		||||
      size_t getPayloadLen() const;
 | 
			
		||||
      size_t getDataStringLen();
 | 
			
		||||
      size_t getDataStringLenOffset();
 | 
			
		||||
      JSON::Value toJSON() const;
 | 
			
		||||
      std::string toSummary() const;
 | 
			
		||||
      Scan getScan() const;
 | 
			
		||||
      Scan getScan();
 | 
			
		||||
    protected:
 | 
			
		||||
      bool master;
 | 
			
		||||
      packType version;
 | 
			
		||||
      void resize(size_t size);
 | 
			
		||||
      char * data;
 | 
			
		||||
      size_t bufferLen;
 | 
			
		||||
      size_t dataLen;
 | 
			
		||||
  /// DTSC_V2 packets are "DTP2", followed by 4 bytes len, 4 bytes trackID, 8 bytes time, and packed
 | 
			
		||||
  /// content. The len is always without the first 8 bytes counted.
 | 
			
		||||
  class Packet{
 | 
			
		||||
  public:
 | 
			
		||||
    Packet();
 | 
			
		||||
    Packet(const Packet &rhs);
 | 
			
		||||
    Packet(const char *data_, unsigned int len, bool noCopy = false);
 | 
			
		||||
    virtual ~Packet();
 | 
			
		||||
    void null();
 | 
			
		||||
    void operator=(const Packet &rhs);
 | 
			
		||||
    operator bool() const;
 | 
			
		||||
    packType getVersion() const;
 | 
			
		||||
    void reInit(Socket::Connection &src);
 | 
			
		||||
    void reInit(const char *data_, unsigned int len, bool noCopy = false);
 | 
			
		||||
    void genericFill(long long packTime, long long packOffset, long long packTrack,
 | 
			
		||||
                     const char *packData, long long packDataSize, uint64_t packBytePos,
 | 
			
		||||
                     bool isKeyframe, int64_t bootMsOffset = 0);
 | 
			
		||||
    void appendData(const char *appendData, uint32_t appendLen);
 | 
			
		||||
    void getString(const char *identifier, char *&result, size_t &len) const;
 | 
			
		||||
    void getString(const char *identifier, std::string &result) const;
 | 
			
		||||
    void getInt(const char *identifier, uint64_t &result) const;
 | 
			
		||||
    uint64_t getInt(const char *identifier) const;
 | 
			
		||||
    void getFlag(const char *identifier, bool &result) const;
 | 
			
		||||
    bool getFlag(const char *identifier) const;
 | 
			
		||||
    bool hasMember(const char *identifier) const;
 | 
			
		||||
    void appendNal(const char *appendData, uint32_t appendLen);
 | 
			
		||||
    void upgradeNal(const char *appendData, uint32_t appendLen);
 | 
			
		||||
    void setKeyFrame(bool kf);
 | 
			
		||||
    virtual uint64_t getTime() const;
 | 
			
		||||
    void setTime(uint64_t _time);
 | 
			
		||||
    void nullMember(const std::string &memb);
 | 
			
		||||
    size_t getTrackId() const;
 | 
			
		||||
    char *getData() const;
 | 
			
		||||
    size_t getDataLen() const;
 | 
			
		||||
    size_t getPayloadLen() const;
 | 
			
		||||
    size_t getDataStringLen();
 | 
			
		||||
    size_t getDataStringLenOffset();
 | 
			
		||||
    JSON::Value toJSON() const;
 | 
			
		||||
    std::string toSummary() const;
 | 
			
		||||
    Scan getScan() const;
 | 
			
		||||
    Scan getScan();
 | 
			
		||||
 | 
			
		||||
      uint64_t prevNalSize;
 | 
			
		||||
  protected:
 | 
			
		||||
    bool master;
 | 
			
		||||
    packType version;
 | 
			
		||||
    void resize(size_t size);
 | 
			
		||||
    char *data;
 | 
			
		||||
    size_t bufferLen;
 | 
			
		||||
    size_t dataLen;
 | 
			
		||||
 | 
			
		||||
    uint64_t prevNalSize;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /// A child class of DTSC::Packet, which allows overriding the packet time efficiently.
 | 
			
		||||
  class RetimedPacket : public Packet {
 | 
			
		||||
    public:
 | 
			
		||||
      RetimedPacket(uint64_t reTime){
 | 
			
		||||
        timeOverride = reTime;
 | 
			
		||||
      }
 | 
			
		||||
      RetimedPacket(uint64_t reTime, const Packet & rhs) : Packet(rhs){
 | 
			
		||||
        timeOverride = reTime;
 | 
			
		||||
      }
 | 
			
		||||
      RetimedPacket(uint64_t reTime, const char * data_, unsigned int len, bool noCopy = false) : Packet(data_, len, noCopy){
 | 
			
		||||
        timeOverride = reTime;
 | 
			
		||||
      }
 | 
			
		||||
      virtual uint64_t getTime() const{return timeOverride;}
 | 
			
		||||
    protected:
 | 
			
		||||
      uint64_t timeOverride;
 | 
			
		||||
  class RetimedPacket : public Packet{
 | 
			
		||||
  public:
 | 
			
		||||
    RetimedPacket(uint64_t reTime){timeOverride = reTime;}
 | 
			
		||||
    RetimedPacket(uint64_t reTime, const Packet &rhs) : Packet(rhs){timeOverride = reTime;}
 | 
			
		||||
    RetimedPacket(uint64_t reTime, const char *data_, unsigned int len, bool noCopy = false)
 | 
			
		||||
        : Packet(data_, len, noCopy){
 | 
			
		||||
      timeOverride = reTime;
 | 
			
		||||
    }
 | 
			
		||||
    virtual uint64_t getTime() const{return timeOverride;}
 | 
			
		||||
 | 
			
		||||
  protected:
 | 
			
		||||
    uint64_t timeOverride;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /// A simple structure used for ordering byte seek positions.
 | 
			
		||||
  struct livePos {
 | 
			
		||||
    livePos() {
 | 
			
		||||
  struct livePos{
 | 
			
		||||
    livePos(){
 | 
			
		||||
      seekTime = 0;
 | 
			
		||||
      trackID = 0;
 | 
			
		||||
    }
 | 
			
		||||
    livePos(const livePos & rhs) {
 | 
			
		||||
    livePos(const livePos &rhs){
 | 
			
		||||
      seekTime = rhs.seekTime;
 | 
			
		||||
      trackID = rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    void operator = (const livePos & rhs) {
 | 
			
		||||
    void operator=(const livePos &rhs){
 | 
			
		||||
      seekTime = rhs.seekTime;
 | 
			
		||||
      trackID = rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    bool operator == (const livePos & rhs) {
 | 
			
		||||
    bool operator==(const livePos &rhs){
 | 
			
		||||
      return seekTime == rhs.seekTime && trackID == rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    bool operator != (const livePos & rhs) {
 | 
			
		||||
    bool operator!=(const livePos &rhs){
 | 
			
		||||
      return seekTime != rhs.seekTime || trackID != rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    bool operator < (const livePos & rhs) const {
 | 
			
		||||
      if (seekTime < rhs.seekTime) {
 | 
			
		||||
    bool operator<(const livePos &rhs) const{
 | 
			
		||||
      if (seekTime < rhs.seekTime){
 | 
			
		||||
        return true;
 | 
			
		||||
      } else {
 | 
			
		||||
        if (seekTime > rhs.seekTime) {
 | 
			
		||||
          return false;
 | 
			
		||||
        }
 | 
			
		||||
      }else{
 | 
			
		||||
        if (seekTime > rhs.seekTime){return false;}
 | 
			
		||||
      }
 | 
			
		||||
      return (trackID < rhs.trackID);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -210,261 +202,274 @@ namespace DTSC {
 | 
			
		|||
  /*LTS-START*/
 | 
			
		||||
  ///\brief Basic class supporting initialization Vectors.
 | 
			
		||||
  ///
 | 
			
		||||
  ///These are used for encryption of data.
 | 
			
		||||
  class Ivec {
 | 
			
		||||
    public:
 | 
			
		||||
      Ivec();
 | 
			
		||||
      Ivec(long long int iVec);
 | 
			
		||||
      void setIvec(long long int iVec);
 | 
			
		||||
      void setIvec(std::string iVec);
 | 
			
		||||
      void setIvec(const char * iVec, int len);
 | 
			
		||||
      long long int asInt();
 | 
			
		||||
      char * getData();
 | 
			
		||||
    private:
 | 
			
		||||
      ///\brief Data storage for this initialization vector.
 | 
			
		||||
      ///
 | 
			
		||||
      /// - 8 bytes: MSB storage of the initialization vector.
 | 
			
		||||
      char data[8];
 | 
			
		||||
  /// These are used for encryption of data.
 | 
			
		||||
  class Ivec{
 | 
			
		||||
  public:
 | 
			
		||||
    Ivec();
 | 
			
		||||
    Ivec(long long int iVec);
 | 
			
		||||
    void setIvec(long long int iVec);
 | 
			
		||||
    void setIvec(std::string iVec);
 | 
			
		||||
    void setIvec(const char *iVec, int len);
 | 
			
		||||
    long long int asInt();
 | 
			
		||||
    char *getData();
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    ///\brief Data storage for this initialization vector.
 | 
			
		||||
    ///
 | 
			
		||||
    /// - 8 bytes: MSB storage of the initialization vector.
 | 
			
		||||
    char data[8];
 | 
			
		||||
  };
 | 
			
		||||
  /*LTS-END*/
 | 
			
		||||
 | 
			
		||||
  ///\brief Basic class for storage of data associated with single DTSC packets, a.k.a. parts.
 | 
			
		||||
  class Part {
 | 
			
		||||
    public:
 | 
			
		||||
      uint32_t getSize();
 | 
			
		||||
      void setSize(uint32_t newSize);
 | 
			
		||||
      uint32_t getDuration();
 | 
			
		||||
      void setDuration(uint32_t newDuration);
 | 
			
		||||
      uint32_t getOffset();
 | 
			
		||||
      void setOffset(uint32_t newOffset);
 | 
			
		||||
      char * getData();
 | 
			
		||||
      void toPrettyString(std::ostream & str, int indent = 0);
 | 
			
		||||
    private:
 | 
			
		||||
  class Part{
 | 
			
		||||
  public:
 | 
			
		||||
    uint32_t getSize();
 | 
			
		||||
    void setSize(uint32_t newSize);
 | 
			
		||||
    uint32_t getDuration();
 | 
			
		||||
    void setDuration(uint32_t newDuration);
 | 
			
		||||
    uint32_t getOffset();
 | 
			
		||||
    void setOffset(uint32_t newOffset);
 | 
			
		||||
    char *getData();
 | 
			
		||||
    void toPrettyString(std::ostream &str, int indent = 0);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
#define PACKED_PART_SIZE 9
 | 
			
		||||
      ///\brief Data storage for this Part.
 | 
			
		||||
      ///
 | 
			
		||||
      /// - 3 bytes: MSB storage of the payload size of this packet in bytes.
 | 
			
		||||
      /// - 3 bytes: MSB storage of the duration of this packet in milliseconds.
 | 
			
		||||
      /// - 3 bytes: MSB storage of the presentation time offset of this packet in milliseconds.
 | 
			
		||||
      char data[PACKED_PART_SIZE];
 | 
			
		||||
    ///\brief Data storage for this Part.
 | 
			
		||||
    ///
 | 
			
		||||
    /// - 3 bytes: MSB storage of the payload size of this packet in bytes.
 | 
			
		||||
    /// - 3 bytes: MSB storage of the duration of this packet in milliseconds.
 | 
			
		||||
    /// - 3 bytes: MSB storage of the presentation time offset of this packet in milliseconds.
 | 
			
		||||
    char data[PACKED_PART_SIZE];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///\brief Basic class for storage of data associated with keyframes.
 | 
			
		||||
  ///
 | 
			
		||||
  /// When deleting this object, make sure to remove all DTSC::Part associated with it, if any. If you fail doing this, it *will* cause data corruption.
 | 
			
		||||
  class Key {
 | 
			
		||||
    public:
 | 
			
		||||
      unsigned long long getBpos();
 | 
			
		||||
      void setBpos(unsigned long long newBpos);
 | 
			
		||||
      unsigned long getLength();
 | 
			
		||||
      void setLength(unsigned long newLength);
 | 
			
		||||
      unsigned long getNumber();
 | 
			
		||||
      void setNumber(unsigned long newNumber);
 | 
			
		||||
      unsigned short getParts();
 | 
			
		||||
      void setParts(unsigned short newParts);
 | 
			
		||||
      unsigned long long getTime();
 | 
			
		||||
      void setTime(unsigned long long newTime);
 | 
			
		||||
      char * getData();
 | 
			
		||||
      void toPrettyString(std::ostream & str, int indent = 0);
 | 
			
		||||
    private:
 | 
			
		||||
  class Key{
 | 
			
		||||
  public:
 | 
			
		||||
    unsigned long long getBpos();
 | 
			
		||||
    void setBpos(unsigned long long newBpos);
 | 
			
		||||
    unsigned long getLength();
 | 
			
		||||
    void setLength(unsigned long newLength);
 | 
			
		||||
    unsigned long getNumber();
 | 
			
		||||
    void setNumber(unsigned long newNumber);
 | 
			
		||||
    unsigned short getParts();
 | 
			
		||||
    void setParts(unsigned short newParts);
 | 
			
		||||
    unsigned long long getTime();
 | 
			
		||||
    void setTime(unsigned long long newTime);
 | 
			
		||||
    char *getData();
 | 
			
		||||
    void toPrettyString(std::ostream &str, int indent = 0);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
#define PACKED_KEY_SIZE 25
 | 
			
		||||
      ///\brief Data storage for this Key.
 | 
			
		||||
      ///
 | 
			
		||||
      /// - 8 bytes: MSB storage of the position of the first packet of this keyframe within the file.
 | 
			
		||||
      /// - 3 bytes: MSB storage of the duration of this keyframe.
 | 
			
		||||
      /// - 4 bytes: MSB storage of the number of this keyframe.
 | 
			
		||||
      /// - 2 bytes: MSB storage of the amount of parts in this keyframe.
 | 
			
		||||
      /// - 8 bytes: MSB storage of the timestamp associated with this keyframe's first packet.
 | 
			
		||||
      char data[PACKED_KEY_SIZE];
 | 
			
		||||
    ///\brief Data storage for this Key.
 | 
			
		||||
    ///
 | 
			
		||||
    /// - 8 bytes: MSB storage of the position of the first packet of this keyframe within the file.
 | 
			
		||||
    /// - 3 bytes: MSB storage of the duration of this keyframe.
 | 
			
		||||
    /// - 4 bytes: MSB storage of the number of this keyframe.
 | 
			
		||||
    /// - 2 bytes: MSB storage of the amount of parts in this keyframe.
 | 
			
		||||
    /// - 8 bytes: MSB storage of the timestamp associated with this keyframe's first packet.
 | 
			
		||||
    char data[PACKED_KEY_SIZE];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///\brief Basic class for storage of data associated with fragments.
 | 
			
		||||
  class Fragment {
 | 
			
		||||
    public:
 | 
			
		||||
      unsigned long getDuration();
 | 
			
		||||
      void setDuration(unsigned long newDuration);
 | 
			
		||||
      char getLength();
 | 
			
		||||
      void setLength(char newLength);
 | 
			
		||||
      unsigned long getNumber();
 | 
			
		||||
      void setNumber(unsigned long newNumber);
 | 
			
		||||
      unsigned long getSize();
 | 
			
		||||
      void setSize(unsigned long newSize);
 | 
			
		||||
      char * getData();
 | 
			
		||||
      void toPrettyString(std::ostream & str, int indent = 0);
 | 
			
		||||
    private:
 | 
			
		||||
  class Fragment{
 | 
			
		||||
  public:
 | 
			
		||||
    unsigned long getDuration();
 | 
			
		||||
    void setDuration(unsigned long newDuration);
 | 
			
		||||
    char getLength();
 | 
			
		||||
    void setLength(char newLength);
 | 
			
		||||
    unsigned long getNumber();
 | 
			
		||||
    void setNumber(unsigned long newNumber);
 | 
			
		||||
    unsigned long getSize();
 | 
			
		||||
    void setSize(unsigned long newSize);
 | 
			
		||||
    char *getData();
 | 
			
		||||
    void toPrettyString(std::ostream &str, int indent = 0);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
#define PACKED_FRAGMENT_SIZE 13
 | 
			
		||||
      ///\brief Data storage for this Fragment.
 | 
			
		||||
      ///
 | 
			
		||||
      /// - 4 bytes: duration (in milliseconds)
 | 
			
		||||
      /// - 1 byte: length (amount of keyframes)
 | 
			
		||||
      /// - 4 bytes: number of first keyframe in fragment
 | 
			
		||||
      /// - 4 bytes: size of fragment in bytes
 | 
			
		||||
      char data[PACKED_FRAGMENT_SIZE];
 | 
			
		||||
    ///\brief Data storage for this Fragment.
 | 
			
		||||
    ///
 | 
			
		||||
    /// - 4 bytes: duration (in milliseconds)
 | 
			
		||||
    /// - 1 byte: length (amount of keyframes)
 | 
			
		||||
    /// - 4 bytes: number of first keyframe in fragment
 | 
			
		||||
    /// - 4 bytes: size of fragment in bytes
 | 
			
		||||
    char data[PACKED_FRAGMENT_SIZE];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///\brief Class for storage of track data
 | 
			
		||||
  class Track {
 | 
			
		||||
    public:
 | 
			
		||||
      Track();      
 | 
			
		||||
      Track(JSON::Value & trackRef);
 | 
			
		||||
      Track(Scan & trackRef);
 | 
			
		||||
      void clearParts();
 | 
			
		||||
            
 | 
			
		||||
      inline operator bool() const {
 | 
			
		||||
        return (parts.size() && keySizes.size() && (keySizes.size() == keys.size()));
 | 
			
		||||
      }
 | 
			
		||||
      /*
 | 
			
		||||
      void update(long long packTime, long long packOffset, long long packDataSize, uint64_t packBytePos, bool isKeyframe, long long packSendSize, unsigned long segment_size = 1900);
 | 
			
		||||
      */
 | 
			
		||||
      void update(long long packTime, long long packOffset, long long packDataSize, uint64_t packBytePos, bool isKeyframe, long long packSendSize, unsigned long segment_size = 1900, const char * iVec = 0);
 | 
			
		||||
      int getSendLen(bool skipDynamic = false);
 | 
			
		||||
      void send(Socket::Connection & conn, bool skipDynamic = false);
 | 
			
		||||
      void writeTo(char *& p);
 | 
			
		||||
      JSON::Value toJSON(bool skipDynamic = false);
 | 
			
		||||
      std::deque<Fragment> fragments;
 | 
			
		||||
      std::deque<Key> keys;
 | 
			
		||||
      std::deque<unsigned long> keySizes;
 | 
			
		||||
      std::deque<Part> parts;
 | 
			
		||||
      std::deque<Ivec> ivecs; /*LTS*/
 | 
			
		||||
      Key & getKey(unsigned int keyNum);
 | 
			
		||||
      Fragment & getFrag(unsigned int fragNum);
 | 
			
		||||
      unsigned int timeToKeynum(unsigned int timestamp);
 | 
			
		||||
      uint32_t timeToFragnum(uint64_t timestamp);
 | 
			
		||||
      void reset();
 | 
			
		||||
      void toPrettyString(std::ostream & str, int indent = 0, int verbosity = 0);
 | 
			
		||||
      void finalize();
 | 
			
		||||
      uint32_t biggestFragment();
 | 
			
		||||
      
 | 
			
		||||
      std::string getIdentifier();
 | 
			
		||||
      std::string getWritableIdentifier();
 | 
			
		||||
      unsigned int trackID;
 | 
			
		||||
      uint64_t firstms;
 | 
			
		||||
      uint64_t lastms;
 | 
			
		||||
      int bps;
 | 
			
		||||
      int max_bps;
 | 
			
		||||
      int missedFrags;
 | 
			
		||||
      std::string init;
 | 
			
		||||
      std::string codec;
 | 
			
		||||
      std::string type;
 | 
			
		||||
      std::string lang;///< ISO 639-2 Language of track, empty or und if unknown.
 | 
			
		||||
      uint32_t minKeepAway;///<Time in MS to never seek closer than live point to
 | 
			
		||||
      //audio only
 | 
			
		||||
      int rate;
 | 
			
		||||
      int size;
 | 
			
		||||
      int channels;
 | 
			
		||||
      //video only
 | 
			
		||||
      int width;
 | 
			
		||||
      int height;
 | 
			
		||||
      int fpks;
 | 
			
		||||
      void removeFirstKey();
 | 
			
		||||
      uint32_t secsSinceFirstFragmentInsert();
 | 
			
		||||
    private:
 | 
			
		||||
      std::string cachedIdent;
 | 
			
		||||
      std::deque<uint32_t> fragInsertTime;
 | 
			
		||||
  class Track{
 | 
			
		||||
  public:
 | 
			
		||||
    Track();
 | 
			
		||||
    Track(JSON::Value &trackRef);
 | 
			
		||||
    Track(Scan &trackRef);
 | 
			
		||||
    void clearParts();
 | 
			
		||||
 | 
			
		||||
    inline operator bool() const{
 | 
			
		||||
      return (parts.size() && keySizes.size() && (keySizes.size() == keys.size()));
 | 
			
		||||
    }
 | 
			
		||||
    /*
 | 
			
		||||
    void update(long long packTime, long long packOffset, long long packDataSize, uint64_t
 | 
			
		||||
    packBytePos, bool isKeyframe, long long packSendSize, unsigned long segment_size = 1900);
 | 
			
		||||
    */
 | 
			
		||||
    void update(long long packTime, long long packOffset, long long packDataSize,
 | 
			
		||||
                uint64_t packBytePos, bool isKeyframe, long long packSendSize,
 | 
			
		||||
                unsigned long segment_size = 1900, const char *iVec = 0);
 | 
			
		||||
    int getSendLen(bool skipDynamic = false);
 | 
			
		||||
    void send(Socket::Connection &conn, bool skipDynamic = false);
 | 
			
		||||
    void writeTo(char *&p);
 | 
			
		||||
    JSON::Value toJSON(bool skipDynamic = false);
 | 
			
		||||
    std::deque<Fragment> fragments;
 | 
			
		||||
    std::deque<Key> keys;
 | 
			
		||||
    std::deque<unsigned long> keySizes;
 | 
			
		||||
    std::deque<Part> parts;
 | 
			
		||||
    std::deque<Ivec> ivecs; /*LTS*/
 | 
			
		||||
    Key &getKey(unsigned int keyNum);
 | 
			
		||||
    Fragment &getFrag(unsigned int fragNum);
 | 
			
		||||
    unsigned int timeToKeynum(unsigned int timestamp);
 | 
			
		||||
    uint32_t timeToFragnum(uint64_t timestamp);
 | 
			
		||||
    void reset();
 | 
			
		||||
    void toPrettyString(std::ostream &str, int indent = 0, int verbosity = 0);
 | 
			
		||||
    void finalize();
 | 
			
		||||
    uint32_t biggestFragment();
 | 
			
		||||
 | 
			
		||||
    std::string getIdentifier();
 | 
			
		||||
    std::string getWritableIdentifier();
 | 
			
		||||
    unsigned int trackID;
 | 
			
		||||
    uint64_t firstms;
 | 
			
		||||
    uint64_t lastms;
 | 
			
		||||
    int bps;
 | 
			
		||||
    int max_bps;
 | 
			
		||||
    int missedFrags;
 | 
			
		||||
    std::string init;
 | 
			
		||||
    std::string codec;
 | 
			
		||||
    std::string type;
 | 
			
		||||
    std::string lang;     ///< ISO 639-2 Language of track, empty or und if unknown.
 | 
			
		||||
    uint32_t minKeepAway; ///< Time in MS to never seek closer than live point to
 | 
			
		||||
    // audio only
 | 
			
		||||
    int rate;
 | 
			
		||||
    int size;
 | 
			
		||||
    int channels;
 | 
			
		||||
    // video only
 | 
			
		||||
    int width;
 | 
			
		||||
    int height;
 | 
			
		||||
    int fpks;
 | 
			
		||||
    void removeFirstKey();
 | 
			
		||||
    uint32_t secsSinceFirstFragmentInsert();
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    std::string cachedIdent;
 | 
			
		||||
    std::deque<uint32_t> fragInsertTime;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///\brief Class for storage of meta data
 | 
			
		||||
  class Meta{
 | 
			
		||||
      /// \todo Make toJSON().toNetpacked() shorter
 | 
			
		||||
    public:
 | 
			
		||||
      Meta();
 | 
			
		||||
      Meta(const DTSC::Packet & source);
 | 
			
		||||
      Meta(JSON::Value & meta);
 | 
			
		||||
      bool nextIsKey;
 | 
			
		||||
    /// \todo Make toJSON().toNetpacked() shorter
 | 
			
		||||
  public:
 | 
			
		||||
    Meta();
 | 
			
		||||
    Meta(const DTSC::Packet &source);
 | 
			
		||||
    Meta(JSON::Value &meta);
 | 
			
		||||
    bool nextIsKey;
 | 
			
		||||
 | 
			
		||||
      inline operator bool() const { //returns if the object contains valid meta data BY LOOKING AT vod/live FLAGS
 | 
			
		||||
        return vod || live;
 | 
			
		||||
      }
 | 
			
		||||
      void reinit(const DTSC::Packet & source);
 | 
			
		||||
      void update(const DTSC::Packet & pack, unsigned long segment_size = 1900);
 | 
			
		||||
      void updatePosOverride(DTSC::Packet & pack, uint64_t bpos);
 | 
			
		||||
      void update(JSON::Value & pack, unsigned long segment_size = 1900);
 | 
			
		||||
      /*LTS
 | 
			
		||||
      void update(long long packTime, long long packOffset, long long packTrack, long long packDataSize, uint64_t packBytePos, bool isKeyframe, long long packSendSize = 0, unsigned long segment_size = 1900);
 | 
			
		||||
      LTS*/
 | 
			
		||||
      void update(long long packTime, long long packOffset, long long packTrack, long long packDataSize, uint64_t packBytePos, bool isKeyframe, long long packSendSize = 0, unsigned long segment_size = 1900, const char * iVec = 0);
 | 
			
		||||
      unsigned int getSendLen(bool skipDynamic = false, std::set<unsigned long> selectedTracks = std::set<unsigned long>());
 | 
			
		||||
      void send(Socket::Connection & conn, bool skipDynamic = false, std::set<unsigned long> selectedTracks = std::set<unsigned long>());
 | 
			
		||||
      void writeTo(char * p);
 | 
			
		||||
      JSON::Value toJSON();
 | 
			
		||||
      void reset();
 | 
			
		||||
      bool toFile(const std::string & fileName);
 | 
			
		||||
      void toPrettyString(std::ostream & str, int indent = 0, int verbosity = 0);
 | 
			
		||||
      //members:
 | 
			
		||||
      std::map<unsigned int, Track> tracks;
 | 
			
		||||
      Track & mainTrack();
 | 
			
		||||
      uint32_t biggestFragment();
 | 
			
		||||
      bool vod;
 | 
			
		||||
      bool live;
 | 
			
		||||
      bool merged;
 | 
			
		||||
      uint16_t version;
 | 
			
		||||
      int64_t moreheader;
 | 
			
		||||
      int64_t bufferWindow;
 | 
			
		||||
      int64_t bootMsOffset;///< Millis to add to packet timestamps to get millis since system boot.
 | 
			
		||||
      std::string sourceURI;
 | 
			
		||||
      JSON::Value inputLocalVars;
 | 
			
		||||
    inline operator bool() const{// returns if the object contains valid meta data BY LOOKING AT vod/live FLAGS
 | 
			
		||||
      return vod || live;
 | 
			
		||||
    }
 | 
			
		||||
    void reinit(const DTSC::Packet &source);
 | 
			
		||||
    void update(const DTSC::Packet &pack, unsigned long segment_size = 1900);
 | 
			
		||||
    void updatePosOverride(DTSC::Packet &pack, uint64_t bpos);
 | 
			
		||||
    void update(JSON::Value &pack, unsigned long segment_size = 1900);
 | 
			
		||||
    /*LTS
 | 
			
		||||
    void update(long long packTime, long long packOffset, long long packTrack, long long
 | 
			
		||||
    packDataSize, uint64_t packBytePos, bool isKeyframe, long long packSendSize = 0, unsigned long
 | 
			
		||||
    segment_size = 1900); LTS*/
 | 
			
		||||
    void update(long long packTime, long long packOffset, long long packTrack,
 | 
			
		||||
                long long packDataSize, uint64_t packBytePos, bool isKeyframe,
 | 
			
		||||
                long long packSendSize = 0, unsigned long segment_size = 1900, const char *iVec = 0);
 | 
			
		||||
    unsigned int getSendLen(bool skipDynamic = false,
 | 
			
		||||
                            std::set<unsigned long> selectedTracks = std::set<unsigned long>());
 | 
			
		||||
    void send(Socket::Connection &conn, bool skipDynamic = false,
 | 
			
		||||
              std::set<unsigned long> selectedTracks = std::set<unsigned long>());
 | 
			
		||||
    void writeTo(char *p);
 | 
			
		||||
    JSON::Value toJSON();
 | 
			
		||||
    void reset();
 | 
			
		||||
    bool toFile(const std::string &fileName);
 | 
			
		||||
    void toPrettyString(std::ostream &str, int indent = 0, int verbosity = 0);
 | 
			
		||||
    // members:
 | 
			
		||||
    std::map<unsigned int, Track> tracks;
 | 
			
		||||
    Track &mainTrack();
 | 
			
		||||
    uint32_t biggestFragment();
 | 
			
		||||
    bool vod;
 | 
			
		||||
    bool live;
 | 
			
		||||
    bool merged;
 | 
			
		||||
    uint16_t version;
 | 
			
		||||
    int64_t moreheader;
 | 
			
		||||
    int64_t bufferWindow;
 | 
			
		||||
    int64_t bootMsOffset; ///< Millis to add to packet timestamps to get millis since system boot.
 | 
			
		||||
    std::string sourceURI;
 | 
			
		||||
    JSON::Value inputLocalVars;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /// An iterator helper for easily iterating over the parts in a Fragment.
 | 
			
		||||
  class PartIter {
 | 
			
		||||
    public:
 | 
			
		||||
      PartIter(Track & Trk, Fragment & frag);
 | 
			
		||||
      Part & operator*() const;///< Dereferences into a Value reference.
 | 
			
		||||
      Part* operator->() const;///< Dereferences into a Value reference.
 | 
			
		||||
      operator bool() const;///< True if not done iterating.
 | 
			
		||||
      PartIter & operator++();///<Go to next iteration.
 | 
			
		||||
    private:
 | 
			
		||||
      uint32_t lastKey;
 | 
			
		||||
      uint32_t currInKey;
 | 
			
		||||
      Track * tRef;
 | 
			
		||||
      std::deque<Part>::iterator pIt;
 | 
			
		||||
      std::deque<Key>::iterator kIt;
 | 
			
		||||
  class PartIter{
 | 
			
		||||
  public:
 | 
			
		||||
    PartIter(Track &Trk, Fragment &frag);
 | 
			
		||||
    Part &operator*() const;  ///< Dereferences into a Value reference.
 | 
			
		||||
    Part *operator->() const; ///< Dereferences into a Value reference.
 | 
			
		||||
    operator bool() const;    ///< True if not done iterating.
 | 
			
		||||
    PartIter &operator++();   ///< Go to next iteration.
 | 
			
		||||
  private:
 | 
			
		||||
    uint32_t lastKey;
 | 
			
		||||
    uint32_t currInKey;
 | 
			
		||||
    Track *tRef;
 | 
			
		||||
    std::deque<Part>::iterator pIt;
 | 
			
		||||
    std::deque<Key>::iterator kIt;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /// A simple wrapper class that will open a file and allow easy reading/writing of DTSC data from/to it.
 | 
			
		||||
  class File {
 | 
			
		||||
    public:
 | 
			
		||||
      File();
 | 
			
		||||
      File(const File & rhs);
 | 
			
		||||
      File(std::string filename, bool create = false);
 | 
			
		||||
      File & operator = (const File & rhs);
 | 
			
		||||
      operator bool() const;
 | 
			
		||||
      ~File();
 | 
			
		||||
      Meta & getMeta();
 | 
			
		||||
      long long int getLastReadPos();
 | 
			
		||||
      bool writeHeader(std::string & header, bool force = false);
 | 
			
		||||
      long long int addHeader(std::string & header);
 | 
			
		||||
      long int getBytePosEOF();
 | 
			
		||||
      long int getBytePos();
 | 
			
		||||
      bool reachedEOF();
 | 
			
		||||
      void seekNext();
 | 
			
		||||
      void parseNext();
 | 
			
		||||
      DTSC::Packet & getPacket();
 | 
			
		||||
      bool seek_time(unsigned int ms);
 | 
			
		||||
      bool seek_time(unsigned int ms, unsigned int trackNo, bool forceSeek = false);
 | 
			
		||||
      bool seek_bpos(int bpos);
 | 
			
		||||
      void rewritePacket(std::string & newPacket, int bytePos);
 | 
			
		||||
      void writePacket(std::string & newPacket);
 | 
			
		||||
      void writePacket(JSON::Value & newPacket);
 | 
			
		||||
      bool atKeyframe();
 | 
			
		||||
      void selectTracks(std::set<unsigned long> & tracks);
 | 
			
		||||
    private:
 | 
			
		||||
      long int endPos;
 | 
			
		||||
      void readHeader(int pos);
 | 
			
		||||
      DTSC::Packet myPack;
 | 
			
		||||
      Meta metadata;
 | 
			
		||||
      std::map<unsigned int, std::string> trackMapping;
 | 
			
		||||
      long long int currtime;
 | 
			
		||||
      long long int lastreadpos;
 | 
			
		||||
      int currframe;
 | 
			
		||||
      FILE * F;
 | 
			
		||||
      unsigned long headerSize;
 | 
			
		||||
      void * buffer;
 | 
			
		||||
      bool created;
 | 
			
		||||
      std::set<seekPos> currentPositions;
 | 
			
		||||
      std::set<unsigned long> selectedTracks;
 | 
			
		||||
  class File{
 | 
			
		||||
  public:
 | 
			
		||||
    File();
 | 
			
		||||
    File(const File &rhs);
 | 
			
		||||
    File(std::string filename, bool create = false);
 | 
			
		||||
    File &operator=(const File &rhs);
 | 
			
		||||
    operator bool() const;
 | 
			
		||||
    ~File();
 | 
			
		||||
    Meta &getMeta();
 | 
			
		||||
    long long int getLastReadPos();
 | 
			
		||||
    bool writeHeader(std::string &header, bool force = false);
 | 
			
		||||
    long long int addHeader(std::string &header);
 | 
			
		||||
    long int getBytePosEOF();
 | 
			
		||||
    long int getBytePos();
 | 
			
		||||
    bool reachedEOF();
 | 
			
		||||
    void seekNext();
 | 
			
		||||
    void parseNext();
 | 
			
		||||
    DTSC::Packet &getPacket();
 | 
			
		||||
    bool seek_time(unsigned int ms);
 | 
			
		||||
    bool seek_time(unsigned int ms, unsigned int trackNo, bool forceSeek = false);
 | 
			
		||||
    bool seek_bpos(int bpos);
 | 
			
		||||
    void rewritePacket(std::string &newPacket, int bytePos);
 | 
			
		||||
    void writePacket(std::string &newPacket);
 | 
			
		||||
    void writePacket(JSON::Value &newPacket);
 | 
			
		||||
    bool atKeyframe();
 | 
			
		||||
    void selectTracks(std::set<unsigned long> &tracks);
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    long int endPos;
 | 
			
		||||
    void readHeader(int pos);
 | 
			
		||||
    DTSC::Packet myPack;
 | 
			
		||||
    Meta metadata;
 | 
			
		||||
    std::map<unsigned int, std::string> trackMapping;
 | 
			
		||||
    long long int currtime;
 | 
			
		||||
    long long int lastreadpos;
 | 
			
		||||
    int currframe;
 | 
			
		||||
    FILE *F;
 | 
			
		||||
    unsigned long headerSize;
 | 
			
		||||
    void *buffer;
 | 
			
		||||
    bool created;
 | 
			
		||||
    std::set<seekPos> currentPositions;
 | 
			
		||||
    std::set<unsigned long> selectedTracks;
 | 
			
		||||
  };
 | 
			
		||||
  //FileWriter
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
  // FileWriter
 | 
			
		||||
 | 
			
		||||
}// namespace DTSC
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue