Compare commits

..

34 Commits

Author SHA1 Message Date
matthewjheaney
91dbee4b6e set version to 1.0.0.7
Change-Id: I09444586c0b1ed6fd5002631a9eece890644d278
2010-11-12 15:01:57 -05:00
matthewjheaney
1e6c5cbaf7 ignore empty clusters when finding next one
Change-Id: I7478e6428c8383a1d05a91e9a44b6d1ee1335da7
2010-11-12 13:30:47 -05:00
matthewjheaney
c62b9f8a21 relax block value check
Change-Id: Ifaf4cbc4176dde8e2653cb9da9888551a872da7b
2010-11-11 22:30:42 -05:00
Hwasoo Lee
5dd6000dc7 updated to handle a laced webm 2010-11-09 09:54:31 -05:00
Hwasoo Lee
3ea595b132 Merge "Updated RELEASE.TXT" 2010-11-08 14:22:15 -08:00
Ryan Thompson
14e42cf98b Made getcluster call const
As Inherited from the super class this call should also be const.
2010-11-08 16:14:04 -05:00
matthewjheaney
6c9f4d11a1 set version to 1.0.0.6
Change-Id: I259171d7bce7f670cb937707a9864aa0b9eb0d22
2010-11-05 15:21:28 -04:00
matthewjheaney
95c134ad53 ensure const correctness
Change-Id: Ia401d66519d1d663e9630ad1e70f18adec0f0bb5
2010-11-04 19:15:16 -04:00
Hwasoo Lee
30bf3472bf Updated RELEASE.TXT 2010-11-03 13:46:44 -04:00
matthewjheaney
7adec5248a added lacing support
Change-Id: I79ce0b6820f62846b05edbc8a0cb381aa2bc32a6
2010-11-02 11:44:31 -04:00
matthewjheaney
093b78faf2 set version to 1.0.0.5
Change-Id: I3643a0019110b1ff7359a8d414bf0cd2ba9b5d54
2010-10-29 14:31:47 -04:00
matthewjheaney
ed90de0d52 check lacing bits
Change-Id: Iaa3a65429b7f3211868a86bbb83ce8018350554a
2010-10-29 14:04:43 -04:00
matthewjheaney
a01e568293 removed IsBFrame selector
Change-Id: Iae51165c318997a9131e9af5c667cfac1f37e773
2010-10-28 17:28:59 -04:00
matthewjheaney
d7ce23a019 handle empty clusters when seeking
Change-Id: I9bb39ff95e308639402e1c7f9aec59c81350d091
2010-10-28 14:45:27 -04:00
matthewjheaney
acf7ddb273 handle empty clusters
Change-Id: I57b085367e1b900acb0ddd6ee419e317f261718a
2010-10-27 16:47:14 -04:00
matthewjheaney
fc12207e15 handle case when no duration
Change-Id: I694f6ce6ae9ecc6fc3b90b954dd7041e82fb9ac0
2010-10-22 13:46:39 -04:00
matthewjheaney
c2f6bea0d8 changed version to 1.0.0.4
Change-Id: I8580a5de258d74b6a83505046d014ad9c6abfc23
2010-10-14 19:34:37 -04:00
matthewjheaney
16934eb76f separate cue-based searches
Change-Id: I5d98be1c9c5bc33b4ef216f48de22220f38c0f36
2010-10-13 13:44:13 -04:00
matthewjheaney
9c15c0f40b Segment::GetCluster returns CuePoint too
Change-Id: Id1b865a9efdcee6b6ef68d4fb323da50f1942f2a
2010-10-12 15:29:28 -04:00
matthewjheaney
43f77d54bd defend against badly-formatted cue points
Change-Id: I72bab89f0828b2c5275a4c4b3ac22ee61a173ddf
2010-10-11 19:09:27 -04:00
matthewjheaney
aec650fed7 made Cues member variables mutable
Change-Id: I405b845f37c9deaffd67e50752fb9b2aa7124484
2010-10-11 12:59:17 -04:00
matthewjheaney
024ad97571 set version to 1.0.0.3
Change-Id: I629400289383482462dac5d0b00f9f615d83db89
2010-10-08 20:19:47 -04:00
matthewjheaney
8f2a2e04d7 load cue point during find
Change-Id: Ied0ea43c85cba47af61c0f60698df18c58389d0c
2010-10-08 20:08:15 -04:00
matthewjheaney
9105d61514 lazy init cues
Change-Id: I20e923bcc4be0dd607fb66a63c4f94b96854573e
2010-10-08 19:35:32 -04:00
matthewjheaney
77f61bdd68 merged Cues::LoadCuePoint into Cues::Find
Change-Id: I7b90dd076418b75e54b1d77bb4a934220019e9df
2010-10-08 19:06:20 -04:00
matthewjheaney
485b6e8125 lazy load cue points as they're searched
Change-Id: Ifa767e579624f4da06670bf791a85cbee4336682
2010-10-08 18:26:44 -04:00
matthewjheaney
1d0c804fb9 allow cue points to be loaded incrementally
Change-Id: I6c10647c8885d9dcb0d6cb10dd2d6ba94a04ea38
2010-10-07 19:07:48 -04:00
matthewjheaney
b607880184 mark position of cues without parsing cues element
Change-Id: I351ecca9dd82be95f8ef46f967983e612846ce87
2010-10-07 14:33:38 -04:00
matthewjheaney
d2688d316d restructured Segment::LoadCluster
Change-Id: Iaf792807445f3866f4ace4cc5663eb6396ac34be
2010-10-06 12:13:33 -04:00
matthewjheaney
885d2e1ef8 do not attempt to reparse cues element
Change-Id: Iebab4960f849fa65ecded360f73c0df8ebac4cc5
2010-10-05 20:42:28 -04:00
matthewjheaney
1cf3a81c78 allow seeking beyond end of cluster cache
Change-Id: I254039af3cb72039b5204f52d0dd613f7a47782d
2010-10-05 20:18:19 -04:00
matthewjheaney
6efbd56948 parse SeekHead to find Cues
Change-Id: I08334e48c587e08392c29dfa4118eb92eca7c25d
2010-10-05 14:12:15 -04:00
matthewjheaney
f56533b30e changed cluster count type from size_t to long
Change-Id: I1957e20b7f565d8e43ee3f983eaceb67f2ddf3cd
2010-10-04 13:55:03 -04:00
Jeff Koppi
ec2b951a78 Add Block::GetOffset() accessor.
Change-Id: I6172c412a8b2b093a365d634e48fcd7a09363111

Added accessor for Block, to query offset value.
2010-10-01 17:21:28 -04:00
4 changed files with 1655 additions and 649 deletions

View File

@@ -1,3 +1,29 @@
1.0.0.5
* Handled case when no duration
* Handled empty clusters
* Handled empty clusters when seeking
* Implemented check lacing bits
1.0.0.4
* Made Cues member variables mutables
* Defined against badly-formatted cue points
* Segment::GetCluster returns CuePoint too
* Separated cue-based searches
1.0.0.3
* Added Block::GetOffset() to get a frame's offset in a block
* Changed cluster count type from size_t to long
* Parsed SeekHead to find cues
* Allowed seeking beyond end of cluster cache
* Added not to attempt to reparse cues element
* Restructured Segment::LoadCluster
* Marked position of cues without parsing cues element
* Allowed cue points to be loaded incrementally
* Implemented to load lazily cue points as they're searched
* Merged Cues::LoadCuePoint into Cues::Find
* Lazy init cues
* Loaded cue point during find
1.0.0.2
* added support for Cues element
* seeking was improved
@@ -5,4 +31,4 @@
1.0.0.1
* fixed item 141
* added item 142
* added this file, RELEASE.TXT, to repository
* added this file, RELEASE.TXT, to repository

File diff suppressed because it is too large Load Diff

View File

@@ -73,22 +73,44 @@ public:
const long long m_size;
Block(long long start, long long size, IMkvReader*);
~Block();
long long GetTrackNumber() const;
long long GetTimeCode(Cluster*) const; //absolute, but not scaled
long long GetTime(Cluster*) const; //absolute, and scaled (ns units)
long long GetTimeCode(const Cluster*) const; //absolute, but not scaled
long long GetTime(const Cluster*) const; //absolute, and scaled (ns)
bool IsKey() const;
void SetKey(bool);
int GetFrameCount() const; //to index frames: [0, count)
struct Frame
{
long long pos; //absolute offset
long len;
long Read(IMkvReader*, unsigned char*) const;
};
#if 0
long long GetOffset() const;
long GetSize() const;
long Read(IMkvReader*, unsigned char*) const;
#else
const Frame& GetFrame(int frame_index) const;
#endif
private:
long long m_track; //Track::Number()
short m_timecode; //relative to cluster
unsigned char m_flags;
#if 0
long long m_frameOff;
long m_frameSize;
#else
Frame* m_frames;
int m_frame_count;
#endif
};
@@ -101,10 +123,10 @@ class BlockEntry
public:
virtual ~BlockEntry();
virtual bool EOS() const = 0;
virtual Cluster* GetCluster() const = 0;
virtual const Cluster* GetCluster() const = 0;
virtual size_t GetIndex() const = 0;
virtual const Block* GetBlock() const = 0;
virtual bool IsBFrame() const = 0;
//virtual bool IsBFrame() const = 0;
protected:
BlockEntry();
@@ -121,10 +143,10 @@ public:
SimpleBlock(Cluster*, size_t, long long start, long long size);
bool EOS() const;
Cluster* GetCluster() const;
const Cluster* GetCluster() const;
size_t GetIndex() const;
const Block* GetBlock() const;
bool IsBFrame() const;
//bool IsBFrame() const;
protected:
Cluster* const m_pCluster;
@@ -144,10 +166,10 @@ public:
~BlockGroup();
bool EOS() const;
Cluster* GetCluster() const;
const Cluster* GetCluster() const;
size_t GetIndex() const;
const Block* GetBlock() const;
bool IsBFrame() const;
//bool IsBFrame() const;
short GetPrevTimeCode() const; //relative to block's time
short GetNextTimeCode() const; //as above
@@ -191,6 +213,7 @@ public:
const char* GetCodecNameAsUTF8() const;
const char* GetCodecId() const;
const unsigned char* GetCodecPrivate(size_t&) const;
bool GetLacing() const;
const BlockEntry* GetEOS() const;
@@ -210,7 +233,9 @@ public:
unsigned char* codecPrivate;
size_t codecPrivateSize;
char* codecNameAsUTF8;
bool lacing;
Settings settings;
Info();
void Clear();
};
@@ -229,7 +254,7 @@ protected:
EOSBlock();
bool EOS() const;
Cluster* GetCluster() const;
const Cluster* GetCluster() const;
size_t GetIndex() const;
const Block* GetBlock() const;
bool IsBFrame() const;
@@ -293,8 +318,8 @@ public:
Tracks(Segment*, long long start, long long size);
virtual ~Tracks();
Track* GetTrackByNumber(unsigned long tn) const;
Track* GetTrackByIndex(unsigned long idx) const;
const Track* GetTrackByNumber(unsigned long tn) const;
const Track* GetTrackByIndex(unsigned long idx) const;
private:
Track** m_trackEntries;
@@ -333,14 +358,19 @@ private:
char* m_pTitleAsUTF8;
};
class Cues;
class CuePoint
{
public:
CuePoint();
friend class Cues;
CuePoint(size_t, long long);
~CuePoint();
void Parse(IMkvReader*, long long start, long long size);
CuePoint(const CuePoint&);
CuePoint& operator=(const CuePoint&);
public:
void Load(IMkvReader*);
long long GetTimeCode() const; //absolute but unscaled
long long GetTime(Segment*) const; //absolute and scaled (ns units)
@@ -360,6 +390,7 @@ public:
const TrackPosition* Find(const Track*) const;
private:
const size_t m_index;
long long m_timecode;
TrackPosition* m_track_positions;
size_t m_track_positions_count;
@@ -369,6 +400,11 @@ private:
class Cues
{
friend class Segment;
Cues(Segment*, long long start, long long size);
~Cues();
Cues(const Cues&);
Cues& operator=(const Cues&);
@@ -377,24 +413,37 @@ public:
const long long m_start;
const long long m_size;
Cues(Segment*, long long start, long long size);
~Cues();
bool Find( //lower bound of time_ns
long long time_ns,
const Track*,
const CuePoint*&,
const CuePoint::TrackPosition*&) const;
#if 0
bool FindNext( //upper_bound of time_ns
long long time_ns,
const Track*,
const CuePoint*&,
const CuePoint::TrackPosition*&) const;
#endif
const CuePoint* GetFirst() const;
const CuePoint* GetLast() const;
const CuePoint* GetNext(const CuePoint*) const;
const BlockEntry* GetBlock(
const CuePoint*,
const CuePoint::TrackPosition*) const;
private:
CuePoint* m_cue_points;
size_t m_cue_points_count;
void Init() const;
bool LoadCuePoint() const;
void PreloadCuePoint(size_t&, long long) const;
mutable CuePoint** m_cue_points;
mutable size_t m_count;
mutable size_t m_preload_count;
mutable long long m_pos;
};
@@ -406,51 +455,55 @@ class Cluster
public:
Segment* const m_pSegment;
const size_t m_index;
public:
static Cluster* Parse(Segment*, size_t, long long off);
static Cluster* Parse(Segment*, long, long long off);
Cluster(); //EndOfStream
~Cluster();
bool EOS() const;
long long GetTimeCode(); //absolute, but not scaled
long long GetTime(); //absolute, and scaled (nanosecond units)
long long GetFirstTime(); //time (ns) of first (earliest) block
long long GetTimeCode() const; //absolute, but not scaled
long long GetTime() const; //absolute, and scaled (nanosecond units)
long long GetFirstTime() const; //time (ns) of first (earliest) block
long long GetLastTime() const; //time (ns) of last (latest) block
const BlockEntry* GetFirst();
const BlockEntry* GetLast();
const BlockEntry* GetFirst() const;
const BlockEntry* GetLast() const;
const BlockEntry* GetNext(const BlockEntry*) const;
const BlockEntry* GetEntry(const Track*);
const BlockEntry* GetEntry(const Track*) const;
const BlockEntry* GetEntry(
const CuePoint&,
const CuePoint::TrackPosition&);
const BlockEntry* GetMaxKey(const VideoTrack*);
const CuePoint::TrackPosition&) const;
const BlockEntry* GetMaxKey(const VideoTrack*) const;
protected:
Cluster(Segment*, size_t, long long off);
Cluster(Segment*, long, long long off);
public:
long long m_pos;
long long m_size;
//TODO: these should all be private, with public selector functions
long m_index;
mutable long long m_pos;
mutable long long m_size;
private:
long long m_timecode;
BlockEntry** m_pEntries;
size_t m_entriesCount;
mutable long long m_timecode;
mutable BlockEntry** m_entries;
mutable size_t m_entriesCount;
void Load();
void LoadBlockEntries();
void ParseBlockGroup(long long, long long, size_t);
void ParseSimpleBlock(long long, long long, size_t);
void Load() const;
void LoadBlockEntries() const;
void ParseBlockGroup(long long, long long, size_t) const;
void ParseSimpleBlock(long long, long long, size_t) const;
};
class Segment
{
friend class Cues;
Segment(const Segment&);
Segment& operator=(const Segment&);
@@ -466,58 +519,53 @@ public:
static long long CreateInstance(IMkvReader*, long long, Segment*&);
~Segment();
//for big-bang loading (source filter)
long Load();
long Load(); //loads headers and all clusters
//for incremental loading (splitter)
long long Unparsed() const;
long long ParseHeaders();
long ParseCluster(Cluster*&, long long& newpos) const;
bool AddCluster(Cluster*, long long);
long long ParseHeaders(); //stops when first cluster is found
long LoadCluster(); //loads one cluster
//This pair parses one cluster, but only changes the state of the
//segment object when the cluster is actually added to the index.
long ParseCluster(long long& cluster_pos, long long& new_pos) const;
bool AddCluster(long long cluster_pos, long long new_pos);
Tracks* GetTracks() const;
const SegmentInfo* GetInfo() const;
long long GetDuration() const;
//NOTE: this turned out to be too inefficient.
//long long Load(long long time_nanoseconds);
Cluster* GetFirst();
Cluster* GetLast();
unsigned long GetCount() const;
Cluster* GetNext(const Cluster*);
Cluster* GetCluster(long long time_nanoseconds);
void GetCluster(
long long time_nanoseconds,
Track*,
Cluster*&,
const BlockEntry*&);
const Cues* GetCues() const;
long long GetDuration() const;
unsigned long GetCount() const;
const Cluster* GetFirst() const;
const Cluster* GetLast() const;
const Cluster* GetNext(const Cluster*);
const Cluster* FindCluster(long long time_nanoseconds) const;
const BlockEntry* Seek(long long time_nanoseconds, const Track*) const;
private:
long long m_pos; //absolute file posn; what has been consumed so far
SegmentInfo* m_pInfo;
Tracks* m_pTracks;
Cues* m_pCues;
Cluster** m_clusters;
size_t m_clusterCount; //number of entries
size_t m_clusterSize; //array size
long m_clusterCount; //number of entries for which m_index >= 0
long m_clusterPreloadCount; //number of entries for which m_index < 0
long m_clusterSize; //array size
void AppendCluster(Cluster*);
void PreloadCluster(Cluster*, ptrdiff_t);
//void ParseSeekHead(long long pos, long long size, size_t*);
//void ParseSeekEntry(long long pos, long long size, size_t*);
//void ParseSecondarySeekHead(long long off, size_t*);
void ParseCues(long long off);
void ParseSeekHead(long long pos, long long size);
void ParseSeekEntry(long long pos, long long size);
void ParseCues(long long);
bool SearchCues(
long long time_ns,
Track*,
Cluster*&,
const BlockEntry*&);
const BlockEntry* GetBlock(
const CuePoint&,
const CuePoint::TrackPosition&);
};

View File

@@ -220,7 +220,7 @@ int main(int argc, char* argv[])
return -1;
}
mkvparser::Cluster* pCluster = pSegment->GetFirst();
const mkvparser::Cluster* pCluster = pSegment->GetFirst();
while ((pCluster != NULL) && !pCluster->EOS())
{
@@ -238,15 +238,22 @@ int main(int argc, char* argv[])
const unsigned long trackNum = pBlock->GetTrackNumber();
const Track* const pTrack = pTracks->GetTrackByNumber(trackNum);
const long long trackType = pTrack->GetType();
const long size = pBlock->GetSize();
const int frameCount = pBlock->GetFrameCount();
const long long time_ns = pBlock->GetTime(pCluster);
printf("\t\t\tBlock\t\t:%s,%15ld,%s,%15lld\n",
printf("\t\t\tBlock\t\t:%s,%s,%15lld\n",
(trackType == VIDEO_TRACK) ? "V" : "A",
size,
pBlock->IsKey() ? "I" : "P",
time_ns);
for (int i = 0; i < frameCount; ++i)
{
const Block::Frame& theFrame = pBlock->GetFrame(i);
const long size = theFrame.len;
const long offset = theFrame.pos;
printf("\t\t\t %15ld,%15lx\n", size, offset);
}
pBlockEntry = pCluster->GetNext(pBlockEntry);
}