New Meta commit
This commit is contained in:
		
							parent
							
								
									fccf66fba2
								
							
						
					
					
						commit
						2b99f2f5ea
					
				
					 183 changed files with 13333 additions and 14421 deletions
				
			
		
							
								
								
									
										627
									
								
								lib/dtsc.h
									
										
									
									
									
								
							
							
						
						
									
										627
									
								
								lib/dtsc.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2,9 +2,12 @@
 | 
			
		|||
/// Holds all headers for DDVTECH Stream Container parsing/generation.
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "defines.h"
 | 
			
		||||
#include "json.h"
 | 
			
		||||
#include "shared_memory.h"
 | 
			
		||||
#include "socket.h"
 | 
			
		||||
#include "timing.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include <deque>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <set>
 | 
			
		||||
| 
						 | 
				
			
			@ -28,6 +31,8 @@
 | 
			
		|||
 | 
			
		||||
namespace DTSC{
 | 
			
		||||
 | 
			
		||||
  extern uint64_t veryUglyJitterOverride;
 | 
			
		||||
 | 
			
		||||
  ///\brief This enum holds all possible datatypes for DTSC packets.
 | 
			
		||||
  enum datatype{
 | 
			
		||||
    AUDIO,          ///< Stream Audio data
 | 
			
		||||
| 
						 | 
				
			
			@ -43,26 +48,6 @@ namespace DTSC{
 | 
			
		|||
  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{
 | 
			
		||||
    ///\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){
 | 
			
		||||
        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.
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  enum packType{DTSC_INVALID, DTSC_HEAD, DTSC_V1, DTSC_V2, DTCM};
 | 
			
		||||
 | 
			
		||||
  /// This class allows scanning through raw binary format DTSC data.
 | 
			
		||||
| 
						 | 
				
			
			@ -78,8 +63,6 @@ namespace DTSC{
 | 
			
		|||
    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;
 | 
			
		||||
| 
						 | 
				
			
			@ -104,7 +87,7 @@ namespace DTSC{
 | 
			
		|||
  class Packet{
 | 
			
		||||
  public:
 | 
			
		||||
    Packet();
 | 
			
		||||
    Packet(const Packet &rhs);
 | 
			
		||||
    Packet(const Packet &rhs, size_t idx = INVALID_TRACK_ID);
 | 
			
		||||
    Packet(const char *data_, unsigned int len, bool noCopy = false);
 | 
			
		||||
    virtual ~Packet();
 | 
			
		||||
    void null();
 | 
			
		||||
| 
						 | 
				
			
			@ -113,9 +96,8 @@ namespace DTSC{
 | 
			
		|||
    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 genericFill(uint64_t packTime, int64_t packOffset, uint32_t packTrack, const char *packData,
 | 
			
		||||
                     size_t packDataSize, uint64_t packBytePos, bool isKeyframe);
 | 
			
		||||
    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;
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +111,6 @@ namespace DTSC{
 | 
			
		|||
    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;
 | 
			
		||||
| 
						 | 
				
			
			@ -139,7 +120,6 @@ namespace DTSC{
 | 
			
		|||
    JSON::Value toJSON() const;
 | 
			
		||||
    std::string toSummary() const;
 | 
			
		||||
    Scan getScan() const;
 | 
			
		||||
    Scan getScan();
 | 
			
		||||
 | 
			
		||||
  protected:
 | 
			
		||||
    bool master;
 | 
			
		||||
| 
						 | 
				
			
			@ -161,315 +141,358 @@ namespace DTSC{
 | 
			
		|||
        : Packet(data_, len, noCopy){
 | 
			
		||||
      timeOverride = reTime;
 | 
			
		||||
    }
 | 
			
		||||
    ~RetimedPacket(){}
 | 
			
		||||
    virtual uint64_t getTime() const{return timeOverride;}
 | 
			
		||||
 | 
			
		||||
  protected:
 | 
			
		||||
    uint64_t timeOverride;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /// A simple structure used for ordering byte seek positions.
 | 
			
		||||
  struct livePos{
 | 
			
		||||
    livePos(){
 | 
			
		||||
      seekTime = 0;
 | 
			
		||||
      trackID = 0;
 | 
			
		||||
    }
 | 
			
		||||
    livePos(const livePos &rhs){
 | 
			
		||||
      seekTime = rhs.seekTime;
 | 
			
		||||
      trackID = rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    void operator=(const livePos &rhs){
 | 
			
		||||
      seekTime = rhs.seekTime;
 | 
			
		||||
      trackID = rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    bool operator==(const livePos &rhs){
 | 
			
		||||
      return seekTime == rhs.seekTime && trackID == rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    bool operator!=(const livePos &rhs){
 | 
			
		||||
      return seekTime != rhs.seekTime || trackID != rhs.trackID;
 | 
			
		||||
    }
 | 
			
		||||
    bool operator<(const livePos &rhs) const{
 | 
			
		||||
      if (seekTime < rhs.seekTime){
 | 
			
		||||
        return true;
 | 
			
		||||
      }else{
 | 
			
		||||
        if (seekTime > rhs.seekTime){return false;}
 | 
			
		||||
      }
 | 
			
		||||
      return (trackID < rhs.trackID);
 | 
			
		||||
    }
 | 
			
		||||
    long long unsigned int seekTime;
 | 
			
		||||
    unsigned int trackID;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /*LTS-START*/
 | 
			
		||||
  ///\brief Basic class supporting initialization Vectors.
 | 
			
		||||
  ///
 | 
			
		||||
  /// These are used for encryption of data.
 | 
			
		||||
  class Ivec{
 | 
			
		||||
  class Parts{
 | 
			
		||||
  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();
 | 
			
		||||
    Parts(const Util::RelAccX &_parts);
 | 
			
		||||
    size_t getFirstValid() const;
 | 
			
		||||
    size_t getEndValid() const;
 | 
			
		||||
    size_t getValidCount() const;
 | 
			
		||||
    size_t getSize(size_t idx) const;
 | 
			
		||||
    uint64_t getDuration(size_t idx) const;
 | 
			
		||||
    int64_t getOffset(size_t idx) const;
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    ///\brief Data storage for this initialization vector.
 | 
			
		||||
    ///
 | 
			
		||||
    /// - 8 bytes: MSB storage of the initialization vector.
 | 
			
		||||
    char data[8];
 | 
			
		||||
    const Util::RelAccX &parts;
 | 
			
		||||
    Util::RelAccXFieldData sizeField;
 | 
			
		||||
    Util::RelAccXFieldData durationField;
 | 
			
		||||
    Util::RelAccXFieldData offsetField;
 | 
			
		||||
  };
 | 
			
		||||
  /*LTS-END*/
 | 
			
		||||
 | 
			
		||||
  ///\brief Basic class for storage of data associated with single DTSC packets, a.k.a. parts.
 | 
			
		||||
  class Part{
 | 
			
		||||
  class Keys{
 | 
			
		||||
  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);
 | 
			
		||||
    Keys(Util::RelAccX &_keys);
 | 
			
		||||
    Keys(const Util::RelAccX &_keys);
 | 
			
		||||
    size_t getFirstValid() const;
 | 
			
		||||
    size_t getEndValid() const;
 | 
			
		||||
    size_t getValidCount() const;
 | 
			
		||||
    size_t getFirstPart(size_t idx) const;
 | 
			
		||||
    size_t getBpos(size_t idx) const;
 | 
			
		||||
    uint64_t getDuration(size_t idx) const;
 | 
			
		||||
    size_t getNumber(size_t idx) const;
 | 
			
		||||
    size_t getParts(size_t idx) const;
 | 
			
		||||
    uint64_t getTime(size_t idx) const;
 | 
			
		||||
    void setSize(size_t idx, size_t _size);
 | 
			
		||||
    size_t getSize(size_t idx) const;
 | 
			
		||||
    size_t getNumForTime(uint64_t time) const;
 | 
			
		||||
 | 
			
		||||
  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];
 | 
			
		||||
    bool isConst;
 | 
			
		||||
    Util::RelAccX empty;
 | 
			
		||||
 | 
			
		||||
    Util::RelAccX &keys;
 | 
			
		||||
    const Util::RelAccX &cKeys;
 | 
			
		||||
 | 
			
		||||
    Util::RelAccXFieldData firstPartField;
 | 
			
		||||
    Util::RelAccXFieldData bposField;
 | 
			
		||||
    Util::RelAccXFieldData durationField;
 | 
			
		||||
    Util::RelAccXFieldData numberField;
 | 
			
		||||
    Util::RelAccXFieldData partsField;
 | 
			
		||||
    Util::RelAccXFieldData timeField;
 | 
			
		||||
    Util::RelAccXFieldData sizeField;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///\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{
 | 
			
		||||
  class Fragments{
 | 
			
		||||
  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);
 | 
			
		||||
    Fragments(const Util::RelAccX &_fragments);
 | 
			
		||||
    size_t getFirstValid() const;
 | 
			
		||||
    size_t getEndValid() const;
 | 
			
		||||
    size_t getValidCount() const;
 | 
			
		||||
    uint64_t getDuration(size_t idx) const;
 | 
			
		||||
    size_t getKeycount(size_t idx) const;
 | 
			
		||||
    size_t getFirstKey(size_t idx) const;
 | 
			
		||||
    size_t getSize(size_t idx) const;
 | 
			
		||||
 | 
			
		||||
  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];
 | 
			
		||||
    const Util::RelAccX &fragments;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///\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:
 | 
			
		||||
#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 Class for storage of track data
 | 
			
		||||
  class Track{
 | 
			
		||||
  public:
 | 
			
		||||
    Track();
 | 
			
		||||
    Track(JSON::Value &trackRef);
 | 
			
		||||
    Track(Scan &trackRef);
 | 
			
		||||
    void clearParts();
 | 
			
		||||
    Util::RelAccX parts;
 | 
			
		||||
    Util::RelAccX keys;
 | 
			
		||||
    Util::RelAccX fragments;
 | 
			
		||||
 | 
			
		||||
    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();
 | 
			
		||||
    Util::RelAccX pages;
 | 
			
		||||
 | 
			
		||||
    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();
 | 
			
		||||
    Util::RelAccX track;
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    std::string cachedIdent;
 | 
			
		||||
    std::deque<uint32_t> fragInsertTime;
 | 
			
		||||
    // Internal buffers so we don't always need to search for everything
 | 
			
		||||
    Util::RelAccXFieldData trackIdField;
 | 
			
		||||
    Util::RelAccXFieldData trackTypeField;
 | 
			
		||||
    Util::RelAccXFieldData trackCodecField;
 | 
			
		||||
    Util::RelAccXFieldData trackFirstmsField;
 | 
			
		||||
    Util::RelAccXFieldData trackLastmsField;
 | 
			
		||||
    Util::RelAccXFieldData trackBpsField;
 | 
			
		||||
    Util::RelAccXFieldData trackMaxbpsField;
 | 
			
		||||
    Util::RelAccXFieldData trackLangField;
 | 
			
		||||
    Util::RelAccXFieldData trackInitField;
 | 
			
		||||
    Util::RelAccXFieldData trackRateField;
 | 
			
		||||
    Util::RelAccXFieldData trackSizeField;
 | 
			
		||||
    Util::RelAccXFieldData trackChannelsField;
 | 
			
		||||
    Util::RelAccXFieldData trackWidthField;
 | 
			
		||||
    Util::RelAccXFieldData trackHeightField;
 | 
			
		||||
    Util::RelAccXFieldData trackFpksField;
 | 
			
		||||
    Util::RelAccXFieldData trackMissedFragsField;
 | 
			
		||||
 | 
			
		||||
    Util::RelAccXFieldData partSizeField;
 | 
			
		||||
    Util::RelAccXFieldData partDurationField;
 | 
			
		||||
    Util::RelAccXFieldData partOffsetField;
 | 
			
		||||
 | 
			
		||||
    Util::RelAccXFieldData keyFirstPartField;
 | 
			
		||||
    Util::RelAccXFieldData keyBposField;
 | 
			
		||||
    Util::RelAccXFieldData keyDurationField;
 | 
			
		||||
    Util::RelAccXFieldData keyNumberField;
 | 
			
		||||
    Util::RelAccXFieldData keyPartsField;
 | 
			
		||||
    Util::RelAccXFieldData keyTimeField;
 | 
			
		||||
    Util::RelAccXFieldData keySizeField;
 | 
			
		||||
 | 
			
		||||
    Util::RelAccXFieldData fragmentDurationField;
 | 
			
		||||
    Util::RelAccXFieldData fragmentKeysField;
 | 
			
		||||
    Util::RelAccXFieldData fragmentFirstKeyField;
 | 
			
		||||
    Util::RelAccXFieldData fragmentSizeField;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ///\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;
 | 
			
		||||
    Meta(const std::string &_streamName, const DTSC::Scan &src);
 | 
			
		||||
    Meta(const std::string &_streamName = "", bool master = true);
 | 
			
		||||
    Meta(const std::string &_streamName, const std::string &fileName);
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
  };
 | 
			
		||||
    ~Meta();
 | 
			
		||||
    void reInit(const std::string &_streamName, bool master = true);
 | 
			
		||||
    void reInit(const std::string &_streamName, const std::string &fileName);
 | 
			
		||||
    void reInit(const std::string &_streamName, const DTSC::Scan &src);
 | 
			
		||||
 | 
			
		||||
  /// 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;
 | 
			
		||||
  };
 | 
			
		||||
    void refresh();
 | 
			
		||||
 | 
			
		||||
  /// 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);
 | 
			
		||||
 | 
			
		||||
    void setMaster(bool _master);
 | 
			
		||||
    bool getMaster() const;
 | 
			
		||||
 | 
			
		||||
    void clear();
 | 
			
		||||
 | 
			
		||||
    void minimalFrom(const Meta &src);
 | 
			
		||||
 | 
			
		||||
    bool trackLoaded(size_t idx) const;
 | 
			
		||||
    bool trackValid(size_t idx) const;
 | 
			
		||||
    size_t trackCount() const;
 | 
			
		||||
 | 
			
		||||
    size_t addCopy(size_t source);
 | 
			
		||||
    size_t addDelayedTrack(size_t fragCount = DEFAULT_FRAGMENT_COUNT, size_t keyCount = DEFAULT_KEY_COUNT,
 | 
			
		||||
                           size_t partCount = DEFAULT_PART_COUNT, size_t pageCount = DEFAULT_PAGE_COUNT);
 | 
			
		||||
    size_t addTrack(size_t fragCount = DEFAULT_FRAGMENT_COUNT, size_t keyCount = DEFAULT_KEY_COUNT,
 | 
			
		||||
                    size_t partCount = DEFAULT_PART_COUNT, size_t pageCount = DEFAULT_PAGE_COUNT,
 | 
			
		||||
                    bool setValid = true);
 | 
			
		||||
    void resizeTrack(size_t source, size_t fragCount = DEFAULT_FRAGMENT_COUNT, size_t keyCount = DEFAULT_KEY_COUNT,
 | 
			
		||||
                     size_t partCount = DEFAULT_PART_COUNT, size_t pageCount = DEFAULT_PAGE_COUNT);
 | 
			
		||||
    void initializeTrack(Track &t, size_t fragCount = DEFAULT_FRAGMENT_COUNT, size_t keyCount = DEFAULT_KEY_COUNT,
 | 
			
		||||
                         size_t parCount = DEFAULT_PART_COUNT, size_t pageCount = DEFAULT_PAGE_COUNT);
 | 
			
		||||
 | 
			
		||||
    void merge(const DTSC::Meta &M, bool deleteTracks = true, bool copyData = true);
 | 
			
		||||
 | 
			
		||||
    void updatePosOverride(DTSC::Packet &pack, uint64_t bpos);
 | 
			
		||||
    void update(const DTSC::Packet &pack);
 | 
			
		||||
    void update(uint64_t packTime, int64_t packOffset, uint32_t packTrack, uint64_t packDataSize,
 | 
			
		||||
                uint64_t packBytePos, bool isKeyframe, uint64_t packSendSize = 0);
 | 
			
		||||
 | 
			
		||||
    size_t trackIDToIndex(size_t trackID, size_t pid = 0) const;
 | 
			
		||||
 | 
			
		||||
    std::string getTrackIdentifier(size_t idx, bool unique = false) const;
 | 
			
		||||
 | 
			
		||||
    void setInit(size_t trackIdx, const std::string &init);
 | 
			
		||||
    void setInit(size_t trackIdx, const char *init, size_t initLen);
 | 
			
		||||
    std::string getInit(size_t idx) const;
 | 
			
		||||
 | 
			
		||||
    void setSource(const std::string &src);
 | 
			
		||||
    std::string getSource() const;
 | 
			
		||||
 | 
			
		||||
    void setID(size_t trackIdx, size_t id);
 | 
			
		||||
    size_t getID(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void markUpdated(size_t trackIdx);
 | 
			
		||||
    uint64_t getLastUpdated(size_t trackIdx) const;
 | 
			
		||||
    uint64_t getLastUpdated() const;
 | 
			
		||||
 | 
			
		||||
    void setChannels(size_t trackIdx, uint16_t channels);
 | 
			
		||||
    uint16_t getChannels(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setRate(size_t trackIdx, uint32_t rate);
 | 
			
		||||
    uint32_t getRate(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setWidth(size_t trackIdx, uint32_t width);
 | 
			
		||||
    uint32_t getWidth(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setHeight(size_t trackIdx, uint32_t height);
 | 
			
		||||
    uint32_t getHeight(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setSize(size_t trackIdx, uint16_t size);
 | 
			
		||||
    uint16_t getSize(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setType(size_t trackIdx, const std::string &type);
 | 
			
		||||
    std::string getType(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setCodec(size_t trackIdx, const std::string &codec);
 | 
			
		||||
    std::string getCodec(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setLang(size_t trackIdx, const std::string &lang);
 | 
			
		||||
    std::string getLang(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setFirstms(size_t trackIdx, uint64_t firstms);
 | 
			
		||||
    uint64_t getFirstms(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setLastms(size_t trackIdx, uint64_t lastms);
 | 
			
		||||
    uint64_t getLastms(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    uint64_t getDuration(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setBps(size_t trackIdx, uint64_t bps);
 | 
			
		||||
    uint64_t getBps(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setMaxBps(size_t trackIdx, uint64_t bps);
 | 
			
		||||
    uint64_t getMaxBps(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setFpks(size_t trackIdx, uint64_t bps);
 | 
			
		||||
    uint64_t getFpks(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setMissedFragments(size_t trackIdx, uint32_t missedFragments);
 | 
			
		||||
    uint32_t getMissedFragments(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setMinKeepAway(size_t trackIdx, uint64_t minKeepAway);
 | 
			
		||||
    uint64_t getMinKeepAway(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    /*LTS-START*/
 | 
			
		||||
    void setSourceTrack(size_t trackIdx, size_t sourceTrack);
 | 
			
		||||
    uint64_t getSourceTrack(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setEncryption(size_t trackIdx, const std::string &encryption);
 | 
			
		||||
    std::string getEncryption(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setPlayReady(size_t trackIdx, const std::string &playReady);
 | 
			
		||||
    std::string getPlayReady(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setWidevine(size_t trackIdx, const std::string &widevine);
 | 
			
		||||
    std::string getWidevine(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setIvec(size_t trackIdx, uint64_t ivec);
 | 
			
		||||
    uint64_t getIvec(size_t trackIdx) const;
 | 
			
		||||
 | 
			
		||||
    void setMinimumFragmentDuration(uint64_t newFragmentDuration = DEFAULT_FRAGMENT_DURATION);
 | 
			
		||||
    uint64_t getMinimumFragmentDuration() const;
 | 
			
		||||
    /*LTS-END*/
 | 
			
		||||
    /*LTS-START
 | 
			
		||||
    uint64_t getFragmentDuration() const{return DEFAULT_FRAGMENT_DURATION;}
 | 
			
		||||
    LTS-END*/
 | 
			
		||||
 | 
			
		||||
    void setVod(bool vod = true);
 | 
			
		||||
    bool getVod() const;
 | 
			
		||||
 | 
			
		||||
    void setLive(bool live = true);
 | 
			
		||||
    bool getLive() const;
 | 
			
		||||
 | 
			
		||||
    bool hasBFrames(size_t idx = INVALID_TRACK_ID) const;
 | 
			
		||||
 | 
			
		||||
    void setBufferWindow(uint64_t bufferWindow);
 | 
			
		||||
    uint64_t getBufferWindow() const;
 | 
			
		||||
 | 
			
		||||
    void setBootMsOffset(uint64_t bootMsOffset);
 | 
			
		||||
    uint64_t getBootMsOffset() const;
 | 
			
		||||
 | 
			
		||||
    std::set<size_t> getValidTracks(bool skipEmpty = false) const;
 | 
			
		||||
    std::set<size_t> getMySourceTracks(size_t pid) const;
 | 
			
		||||
 | 
			
		||||
    void validateTrack(size_t trackIdx);
 | 
			
		||||
    void removeEmptyTracks();
 | 
			
		||||
    void removeTrack(size_t trackIdx);
 | 
			
		||||
    void removeFirstKey(size_t trackIdx);
 | 
			
		||||
 | 
			
		||||
    size_t mainTrack() const;
 | 
			
		||||
    uint32_t biggestFragment(uint32_t idx = INVALID_TRACK_ID) const;
 | 
			
		||||
    bool tracksAlign(size_t idx1, size_t idx2) const;
 | 
			
		||||
 | 
			
		||||
    uint64_t getTimeForFragmentIndex(uint32_t idx, uint32_t fragmentIdx) const;
 | 
			
		||||
    uint32_t getFragmentIndexForTime(uint32_t idx, uint64_t timestamp) const;
 | 
			
		||||
 | 
			
		||||
    uint64_t getTimeForKeyIndex(uint32_t idx, uint32_t keyIdx) const;
 | 
			
		||||
    uint32_t getKeyIndexForTime(uint32_t idx, uint64_t timestamp) const;
 | 
			
		||||
 | 
			
		||||
    uint32_t getPartIndex(const DTSC::Packet &pack, size_t idx) const;
 | 
			
		||||
 | 
			
		||||
    bool nextPageAvailable(uint32_t idx, size_t currentPage) const;
 | 
			
		||||
    size_t getPageNumberForTime(uint32_t idx, uint64_t time) const;
 | 
			
		||||
    size_t getPageNumberForKey(uint32_t idx, uint64_t keynumber) const;
 | 
			
		||||
 | 
			
		||||
    const Util::RelAccX &parts(size_t idx) const;
 | 
			
		||||
    Util::RelAccX &keys(size_t idx);
 | 
			
		||||
    const Util::RelAccX &keys(size_t idx) const;
 | 
			
		||||
    const Util::RelAccX &fragments(size_t idx) const;
 | 
			
		||||
    Util::RelAccX &pages(size_t idx);
 | 
			
		||||
    const Util::RelAccX &pages(size_t idx) const;
 | 
			
		||||
 | 
			
		||||
    std::string toPrettyString() const;
 | 
			
		||||
 | 
			
		||||
    void remap(const std::string &_streamName = "");
 | 
			
		||||
 | 
			
		||||
    uint64_t getSendLen(bool skipDynamic = false, std::set<size_t> selectedTracks = std::set<size_t>()) const;
 | 
			
		||||
    void toFile(const std::string &fName) const;
 | 
			
		||||
    void send(Socket::Connection &conn, bool skypDynamic = false,
 | 
			
		||||
              std::set<size_t> selectedTracks = std::set<size_t>(), bool reID = false) const;
 | 
			
		||||
    void toJSON(JSON::Value &res, bool skipDynamic = true, bool tracksOnly = false) const;
 | 
			
		||||
 | 
			
		||||
    std::string getStreamName() const{return streamName;}
 | 
			
		||||
 | 
			
		||||
    JSON::Value inputLocalVars;
 | 
			
		||||
 | 
			
		||||
    uint8_t version;
 | 
			
		||||
 | 
			
		||||
  protected:
 | 
			
		||||
    void sBufMem(size_t trackCount = DEFAULT_TRACK_COUNT);
 | 
			
		||||
    void sBufShm(const std::string &_streamName, size_t trackCount = DEFAULT_TRACK_COUNT, bool master = true);
 | 
			
		||||
    void streamInit(size_t trackCount = DEFAULT_TRACK_COUNT);
 | 
			
		||||
 | 
			
		||||
    std::string streamName;
 | 
			
		||||
 | 
			
		||||
    IPC::sharedPage streamPage;
 | 
			
		||||
    Util::RelAccX stream;
 | 
			
		||||
    Util::RelAccX trackList;
 | 
			
		||||
    std::map<size_t, Track> tracks;
 | 
			
		||||
    std::map<size_t, IPC::sharedPage> tM;
 | 
			
		||||
 | 
			
		||||
    bool isMaster;
 | 
			
		||||
 | 
			
		||||
    char *streamMemBuf;
 | 
			
		||||
    bool isMemBuf;
 | 
			
		||||
    std::map<size_t, char *> tMemBuf;
 | 
			
		||||
    std::map<size_t, size_t> sizeMemBuf;
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
    // Internal buffers so we don't always need to search for everything
 | 
			
		||||
    Util::RelAccXFieldData streamVodField;
 | 
			
		||||
    Util::RelAccXFieldData streamLiveField;
 | 
			
		||||
    Util::RelAccXFieldData streamSourceField;
 | 
			
		||||
    Util::RelAccXFieldData streamBufferWindowField;
 | 
			
		||||
    Util::RelAccXFieldData streamBootMsOffsetField;
 | 
			
		||||
    Util::RelAccXFieldData streamMinimumFragmentDurationField;
 | 
			
		||||
 | 
			
		||||
    Util::RelAccXFieldData trackValidField;
 | 
			
		||||
    Util::RelAccXFieldData trackIdField;
 | 
			
		||||
    Util::RelAccXFieldData trackTypeField;
 | 
			
		||||
    Util::RelAccXFieldData trackCodecField;
 | 
			
		||||
    Util::RelAccXFieldData trackPageField;
 | 
			
		||||
    Util::RelAccXFieldData trackLastUpdateField;
 | 
			
		||||
    Util::RelAccXFieldData trackPidField;
 | 
			
		||||
    Util::RelAccXFieldData trackMinKeepAwayField;
 | 
			
		||||
    Util::RelAccXFieldData trackSourceTidField;
 | 
			
		||||
    Util::RelAccXFieldData trackEncryptionField;
 | 
			
		||||
    Util::RelAccXFieldData trackIvecField;
 | 
			
		||||
    Util::RelAccXFieldData trackWidevineField;
 | 
			
		||||
    Util::RelAccXFieldData trackPlayreadyField;
 | 
			
		||||
  };
 | 
			
		||||
}// namespace DTSC
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue