Compare commits

..

16 Commits

Author SHA1 Message Date
matthewjheaney
5b06b22b31 libwebm: removed warning in x64 mode
Change-Id: I391ad625babdede58c8025b332ee2c949e930454
2011-01-24 22:45:10 -05:00
matthewjheaney
598de03ef3 libwebm: version 1.0.0.13
Change-Id: I6417dfd731604461939a780d0fb411b888ae1d32
2011-01-24 22:40:19 -05:00
matthewjheaney
94f2d589fc libwebm: tolerate errors in SeekHead element
Change-Id: I380f43dd495dc5107f5df37f9d05ff67da4f8424
2011-01-24 20:50:12 -05:00
matthewjheaney
786357a59d version 1.0.0.12
Supports incremental (partial) loading
Supports incremental parsing of Cues element

Change-Id: I38ef8dc56b970a7401aa4561197bf93e2df979da
2011-01-22 13:48:09 -05:00
matthewjheaney
6e723319e8 added support for incremental (partial) loading
Change-Id: Ic411e6214fdfc3e23a7e3f621f9fb8be0d650d50
2011-01-21 20:04:58 -05:00
matthewjheaney
9911f61616 incrementally parse cue points
Change-Id: I83699208eabb2433b25f634927b7c0be8623c3a2
2011-01-19 21:22:37 -05:00
matthewjheaney
b0f96983d2 changed version to 1.0.0.11
Change-Id: I22e85c56a3be07dba0959520a40b341b807f377c
2011-01-14 18:21:35 -05:00
matthewjheaney
6d7732575a added comment to fix VideoTrack::Seek
Change-Id: I2a8b3e4ca92bdfd2d77c84ab970379d22a06e451
2011-01-14 18:17:16 -05:00
matthewjheaney
8081c58b9b LoadCluster: ensure avail before geting uint len
Change-Id: I421501fcd9fdc017eee5307834911fbd18b510b0
2011-01-13 23:30:47 -05:00
matthewjheaney
00aa1804e9 Segment::ParseHeaders return wrong result when underflow
Change-Id: Iabdec9c2f062ec2fc6c9edeec208c4efc07c8307
2011-01-13 22:53:54 -05:00
matthewjheaney
bb8dfbe026 Segment::ParseNext is implemented
Change-Id: I31100afd4c16c48b366b7a29bec597909f9e2bbc
2011-01-13 15:11:33 -05:00
Hwasoo Lee
b81751642e initialized members using initialize list of EBMLHeader
Change-Id: I5bb46132141d7381dd23e0a3b87a3b6c0e8b7f4b
2011-01-13 15:00:16 -05:00
Hwasoo Lee
3b0f1b6d2b fixed memory leaks from utf8towcs()
Change-Id: I4d35b67da464c073d86f465801f64b15e69a8de2
2011-01-06 15:23:28 -05:00
Frank Galligan
d1aff34626 Added EBML element start and size to Segment Info, Tracks, Track,
Cluster, Cues, and CuePoint. The information was needed for some
tools bieng worked on. Element start is byte offset of the EMBL ID's
first byte.

Change-Id: I64e0a48932630e0a5269418f4979487d6d7bce60
2011-01-05 13:57:29 -05:00
matthewjheaney
6623441ee8 changed version to 1.0.0.10
Change-Id: Ib5acbe084dce95b1bb520731015ff345390acad8
2010-12-16 15:13:41 -05:00
matthewjheaney
3ba8df9a64 return invisible flag setting
Change-Id: I1953b0a590813302054245b8ceb5430aa1d9d09b
2010-12-14 15:05:35 -05:00
3 changed files with 1341 additions and 117 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -56,6 +56,7 @@ struct EBMLHeader
long long m_docTypeReadVersion; long long m_docTypeReadVersion;
long long Parse(IMkvReader*, long long&); long long Parse(IMkvReader*, long long&);
void Init();
}; };
@@ -80,6 +81,7 @@ public:
long long GetTime(const Cluster*) const; //absolute, and scaled (ns) long long GetTime(const Cluster*) const; //absolute, and scaled (ns)
bool IsKey() const; bool IsKey() const;
void SetKey(bool); void SetKey(bool);
bool IsInvisible() const;
int GetFrameCount() const; //to index frames: [0, count) int GetFrameCount() const; //to index frames: [0, count)
@@ -91,26 +93,15 @@ public:
long Read(IMkvReader*, unsigned char*) const; 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; const Frame& GetFrame(int frame_index) const;
#endif
private: private:
long long m_track; //Track::Number() long long m_track; //Track::Number()
short m_timecode; //relative to cluster short m_timecode; //relative to cluster
unsigned char m_flags; unsigned char m_flags;
#if 0
long long m_frameOff;
long m_frameSize;
#else
Frame* m_frames; Frame* m_frames;
int m_frame_count; int m_frame_count;
#endif
}; };
@@ -205,6 +196,8 @@ class Track
public: public:
Segment* const m_pSegment; Segment* const m_pSegment;
const long long m_element_start;
const long long m_element_size;
virtual ~Track(); virtual ~Track();
long long GetType() const; long long GetType() const;
@@ -247,7 +240,11 @@ public:
virtual long Seek(long long time_ns, const BlockEntry*&) const = 0; virtual long Seek(long long time_ns, const BlockEntry*&) const = 0;
protected: protected:
Track(Segment*, const Info&); Track(
Segment*,
const Info&,
long long element_start,
long long element_size);
const Info m_info; const Info m_info;
class EOSBlock : public BlockEntry class EOSBlock : public BlockEntry
@@ -273,7 +270,11 @@ class VideoTrack : public Track
VideoTrack& operator=(const VideoTrack&); VideoTrack& operator=(const VideoTrack&);
public: public:
VideoTrack(Segment*, const Info&); VideoTrack(
Segment*,
const Info&,
long long element_start,
long long element_size);
long long GetWidth() const; long long GetWidth() const;
long long GetHeight() const; long long GetHeight() const;
double GetFrameRate() const; double GetFrameRate() const;
@@ -295,7 +296,11 @@ class AudioTrack : public Track
AudioTrack& operator=(const AudioTrack&); AudioTrack& operator=(const AudioTrack&);
public: public:
AudioTrack(Segment*, const Info&); AudioTrack(
Segment*,
const Info&,
long long element_start,
long long element_size);
double GetSamplingRate() const; double GetSamplingRate() const;
long long GetChannels() const; long long GetChannels() const;
long long GetBitDepth() const; long long GetBitDepth() const;
@@ -318,8 +323,15 @@ public:
Segment* const m_pSegment; Segment* const m_pSegment;
const long long m_start; const long long m_start;
const long long m_size; const long long m_size;
const long long m_element_start;
const long long m_element_size;
Tracks(Segment*, long long start, long long size); Tracks(
Segment*,
long long start,
long long size,
long long element_start,
long long element_size);
virtual ~Tracks(); virtual ~Tracks();
const Track* GetTrackByNumber(unsigned long tn) const; const Track* GetTrackByNumber(unsigned long tn) const;
@@ -329,7 +341,12 @@ private:
Track** m_trackEntries; Track** m_trackEntries;
Track** m_trackEntriesEnd; Track** m_trackEntriesEnd;
void ParseTrackEntry(long long, long long, Track*&); void ParseTrackEntry(
long long,
long long,
Track*&,
long long element_start,
long long element_size);
public: public:
unsigned long GetTracksCount() const; unsigned long GetTracksCount() const;
@@ -345,9 +362,18 @@ public:
Segment* const m_pSegment; Segment* const m_pSegment;
const long long m_start; const long long m_start;
const long long m_size; const long long m_size;
const long long m_element_start;
const long long m_element_size;
SegmentInfo(
Segment*,
long long start,
long long size,
long long element_start,
long long element_size);
SegmentInfo(Segment*, long long start, long long size);
~SegmentInfo(); ~SegmentInfo();
long long GetTimeCodeScale() const; long long GetTimeCodeScale() const;
long long GetDuration() const; //scaled long long GetDuration() const; //scaled
const char* GetMuxingAppAsUTF8() const; const char* GetMuxingAppAsUTF8() const;
@@ -362,6 +388,49 @@ private:
char* m_pTitleAsUTF8; char* m_pTitleAsUTF8;
}; };
class SeekHead
{
SeekHead(const SeekHead&);
SeekHead& operator=(const SeekHead&);
public:
Segment* const m_pSegment;
const long long m_start;
const long long m_size;
const long long m_element_start;
const long long m_element_size;
SeekHead(
Segment*,
long long start,
long long size,
long long element_start,
long long element_size);
~SeekHead();
struct Entry
{
long long id;
long long pos;
};
int GetCount() const;
const Entry* GetEntry(int idx) const;
private:
Entry* m_entries;
int m_count;
static void ParseEntry(
IMkvReader*,
long long pos,
long long size,
Entry*&);
};
class Cues; class Cues;
class CuePoint class CuePoint
{ {
@@ -374,6 +443,9 @@ class CuePoint
CuePoint& operator=(const CuePoint&); CuePoint& operator=(const CuePoint&);
public: public:
long long m_element_start;
long long m_element_size;
void Load(IMkvReader*); void Load(IMkvReader*);
long long GetTimeCode() const; //absolute but unscaled long long GetTimeCode() const; //absolute but unscaled
@@ -406,7 +478,12 @@ class Cues
{ {
friend class Segment; friend class Segment;
Cues(Segment*, long long start, long long size); Cues(
Segment*,
long long start,
long long size,
long long element_start,
long long element_size);
~Cues(); ~Cues();
Cues(const Cues&); Cues(const Cues&);
@@ -416,6 +493,8 @@ public:
Segment* const m_pSegment; Segment* const m_pSegment;
const long long m_start; const long long m_start;
const long long m_size; const long long m_size;
const long long m_element_start;
const long long m_element_size;
bool Find( //lower bound of time_ns bool Find( //lower bound of time_ns
long long time_ns, long long time_ns,
@@ -439,9 +518,10 @@ public:
const CuePoint*, const CuePoint*,
const CuePoint::TrackPosition*) const; const CuePoint::TrackPosition*) const;
bool LoadCuePoint() const;
private: private:
void Init() const; void Init() const;
bool LoadCuePoint() const;
void PreloadCuePoint(size_t&, long long) const; void PreloadCuePoint(size_t&, long long) const;
mutable CuePoint** m_cue_points; mutable CuePoint** m_cue_points;
@@ -461,7 +541,12 @@ public:
Segment* const m_pSegment; Segment* const m_pSegment;
public: public:
static Cluster* Parse(Segment*, long, long long off); static Cluster* Parse(
Segment*,
long,
long long off,
long long element_start,
long long element_size);
Cluster(); //EndOfStream Cluster(); //EndOfStream
~Cluster(); ~Cluster();
@@ -484,21 +569,30 @@ public:
static bool HasBlockEntries(const Segment*, long long); static bool HasBlockEntries(const Segment*, long long);
void Load() const;
long Load(long long& pos, long& size) const;
protected: protected:
Cluster(Segment*, long, long long off); Cluster(
Segment*,
long,
long long off,
long long element_start,
long long element_size);
public: public:
//TODO: these should all be private, with public selector functions //TODO: these should all be private, with public selector functions
long m_index; long m_index;
mutable long long m_pos; mutable long long m_pos;
mutable long long m_size; mutable long long m_size;
const long long m_element_start;
const long long m_element_size;
private: private:
mutable long long m_timecode; mutable long long m_timecode;
mutable BlockEntry** m_entries; mutable BlockEntry** m_entries;
mutable long m_entries_count; mutable long m_entries_count;
void Load() const;
void LoadBlockEntries() const; void LoadBlockEntries() const;
void ParseBlockGroup(long long, long long, size_t) const; void ParseBlockGroup(long long, long long, size_t) const;
void ParseSimpleBlock(long long, long long, size_t) const; void ParseSimpleBlock(long long, long long, size_t) const;
@@ -536,12 +630,19 @@ public:
long LoadCluster(long long& pos, long& size); //load one cluster long LoadCluster(long long& pos, long& size); //load one cluster
long LoadCluster(); long LoadCluster();
long ParseNext(
const Cluster* pCurr,
const Cluster*& pNext,
long long& pos,
long& size);
//This pair parses one cluster, but only changes the state of the //This pair parses one cluster, but only changes the state of the
//segment object when the cluster is actually added to the index. //segment object when the cluster is actually added to the index.
long ParseCluster(long long& cluster_pos, long long& new_pos) const; long ParseCluster(long long& cluster_pos, long long& new_pos) const;
bool AddCluster(long long cluster_pos, long long new_pos); bool AddCluster(long long cluster_pos, long long new_pos);
Tracks* GetTracks() const; const SeekHead* GetSeekHead() const;
const Tracks* GetTracks() const;
const SegmentInfo* GetInfo() const; const SegmentInfo* GetInfo() const;
const Cues* GetCues() const; const Cues* GetCues() const;
@@ -555,9 +656,18 @@ public:
const Cluster* FindCluster(long long time_nanoseconds) const; const Cluster* FindCluster(long long time_nanoseconds) const;
//const BlockEntry* Seek(long long time_nanoseconds, const Track*) const; //const BlockEntry* Seek(long long time_nanoseconds, const Track*) const;
const Cluster* FindOrPreloadCluster(long long pos);
long ParseCues(
long long cues_off, //offset relative to start of segment
long long& parse_pos,
long& parse_len);
private: private:
long long m_pos; //absolute file posn; what has been consumed so far long long m_pos; //absolute file posn; what has been consumed so far
SeekHead* m_pSeekHead;
SegmentInfo* m_pInfo; SegmentInfo* m_pInfo;
Tracks* m_pTracks; Tracks* m_pTracks;
Cues* m_pCues; Cues* m_pCues;
@@ -569,9 +679,9 @@ private:
void AppendCluster(Cluster*); void AppendCluster(Cluster*);
void PreloadCluster(Cluster*, ptrdiff_t); void PreloadCluster(Cluster*, ptrdiff_t);
void ParseSeekHead(long long pos, long long size); //void ParseSeekHead(long long pos, long long size);
void ParseSeekEntry(long long pos, long long size); //void ParseSeekEntry(long long pos, long long size);
void ParseCues(long long); //void ParseCues(long long);
const BlockEntry* GetBlock( const BlockEntry* GetBlock(
const CuePoint&, const CuePoint&,

View File

@@ -109,22 +109,32 @@ int main(int argc, char* argv[])
printf("\t\tDuration\t\t: %lld\n", duration_ns); printf("\t\tDuration\t\t: %lld\n", duration_ns);
const double duration_sec = double(duration_ns) / 1000000000; const double duration_sec = double(duration_ns) / 1000000000;
printf("\t\tDuration(secs)\t\t: %7.3f\n", duration_sec); printf("\t\tDuration(secs)\t\t: %7.3lf\n", duration_sec);
if (pTitle == NULL) if (pTitle == NULL)
printf("\t\tTrack Name\t\t: NULL\n"); printf("\t\tTrack Name\t\t: NULL\n");
else else
{
printf("\t\tTrack Name\t\t: %ls\n", pTitle); printf("\t\tTrack Name\t\t: %ls\n", pTitle);
delete [] pTitle;
}
if (pMuxingApp == NULL) if (pMuxingApp == NULL)
printf("\t\tMuxing App\t\t: NULL\n"); printf("\t\tMuxing App\t\t: NULL\n");
else else
{
printf("\t\tMuxing App\t\t: %ls\n", pMuxingApp); printf("\t\tMuxing App\t\t: %ls\n", pMuxingApp);
delete [] pMuxingApp;
}
if (pWritingApp == NULL) if (pWritingApp == NULL)
printf("\t\tWriting App\t\t: NULL\n"); printf("\t\tWriting App\t\t: NULL\n");
else else
{
printf("\t\tWriting App\t\t: %ls\n", pWritingApp); printf("\t\tWriting App\t\t: %ls\n", pWritingApp);
delete [] pWritingApp;
}
// pos of segment payload // pos of segment payload
printf("\t\tPosition(Segment)\t: %lld\n", pSegment->m_start); printf("\t\tPosition(Segment)\t: %lld\n", pSegment->m_start);
@@ -153,14 +163,17 @@ int main(int argc, char* argv[])
const unsigned long long trackUid = pTrack->GetUid(); const unsigned long long trackUid = pTrack->GetUid();
const wchar_t* const pTrackName = utf8towcs(pTrack->GetNameAsUTF8()); const wchar_t* const pTrackName = utf8towcs(pTrack->GetNameAsUTF8());
printf("\t\tTrack Type\t\t: %ld\n", trackType); printf("\t\tTrack Type\t\t: %lld\n", trackType);
printf("\t\tTrack Number\t\t: %ld\n", trackNumber); printf("\t\tTrack Number\t\t: %lld\n", trackNumber);
printf("\t\tTrack Uid\t\t: %lld\n", trackUid); printf("\t\tTrack Uid\t\t: %lld\n", trackUid);
if (pTrackName == NULL) if (pTrackName == NULL)
printf("\t\tTrack Name\t\t: NULL\n"); printf("\t\tTrack Name\t\t: NULL\n");
else else
{
printf("\t\tTrack Name\t\t: %ls \n", pTrackName); printf("\t\tTrack Name\t\t: %ls \n", pTrackName);
delete [] pTrackName;
}
const char* const pCodecId = pTrack->GetCodecId(); const char* const pCodecId = pTrack->GetCodecId();
@@ -175,7 +188,10 @@ int main(int argc, char* argv[])
if (pCodecName == NULL) if (pCodecName == NULL)
printf("\t\tCodec Name\t\t: NULL\n"); printf("\t\tCodec Name\t\t: NULL\n");
else else
{
printf("\t\tCodec Name\t\t: %ls\n", pCodecName); printf("\t\tCodec Name\t\t: %ls\n", pCodecName);
delete [] pCodecName;
}
if (trackType == VIDEO_TRACK) if (trackType == VIDEO_TRACK)
{ {
@@ -252,7 +268,7 @@ int main(int argc, char* argv[])
const Block::Frame& theFrame = pBlock->GetFrame(i); const Block::Frame& theFrame = pBlock->GetFrame(i);
const long size = theFrame.len; const long size = theFrame.len;
const long long offset = theFrame.pos; const long long offset = theFrame.pos;
printf("\t\t\t %15ld,%15lx\n", size, offset); printf("\t\t\t %15ld,%15llx\n", size, offset);
} }
pBlockEntry = pCluster->GetNext(pBlockEntry); pBlockEntry = pCluster->GetNext(pBlockEntry);