Merge "third_party/libwebm: pull from upstream"

This commit is contained in:
Vignesh Venkatasubramanian
2014-05-06 11:15:57 -07:00
committed by Gerrit Code Review
13 changed files with 6930 additions and 8562 deletions

View File

@@ -1,5 +1,5 @@
URL: https://chromium.googlesource.com/webm/libwebm URL: https://chromium.googlesource.com/webm/libwebm
Version: a7118d8ec564e9db841da1eb01f547f3229f240a Version: 249629d46c6e9391f25a90cff6d19075f47474cb
License: BSD License: BSD
License File: LICENSE.txt License File: LICENSE.txt

File diff suppressed because it is too large Load Diff

View File

@@ -60,8 +60,8 @@ class IMkvWriter {
bool WriteEbmlHeader(IMkvWriter* writer); bool WriteEbmlHeader(IMkvWriter* writer);
// Copies in Chunk from source to destination between the given byte positions // Copies in Chunk from source to destination between the given byte positions
bool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, bool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, int64 start,
int64 start, int64 size); int64 size);
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
// Class to hold data the will be written to a block. // Class to hold data the will be written to a block.
@@ -74,8 +74,7 @@ class Frame {
bool Init(const uint8* frame, uint64 length); bool Init(const uint8* frame, uint64 length);
// Copies |additional| data into |additional_|. Returns true on success. // Copies |additional| data into |additional_|. Returns true on success.
bool AddAdditionalData(const uint8* additional, uint64 length, bool AddAdditionalData(const uint8* additional, uint64 length, uint64 add_id);
uint64 add_id);
uint64 add_id() const { return add_id_; } uint64 add_id() const { return add_id_; }
const uint8* additional() const { return additional_; } const uint8* additional() const { return additional_; }
@@ -223,9 +222,7 @@ class Cues {
// ContentEncAESSettings element // ContentEncAESSettings element
class ContentEncAESSettings { class ContentEncAESSettings {
public: public:
enum { enum { kCTR = 1 };
kCTR = 1
};
ContentEncAESSettings(); ContentEncAESSettings();
~ContentEncAESSettings() {} ~ContentEncAESSettings() {}
@@ -353,6 +350,10 @@ class Track {
seek_pre_roll_ = seek_pre_roll; seek_pre_roll_ = seek_pre_roll;
} }
uint64 seek_pre_roll() const { return seek_pre_roll_; } uint64 seek_pre_roll() const { return seek_pre_roll_; }
void set_default_duration(uint64 default_duration) {
default_duration_ = default_duration;
}
uint64 default_duration() const { return default_duration_; }
uint64 codec_private_length() const { return codec_private_length_; } uint64 codec_private_length() const { return codec_private_length_; }
uint32 content_encoding_entries_size() const { uint32 content_encoding_entries_size() const {
@@ -360,7 +361,7 @@ class Track {
} }
private: private:
// Track element names // Track element names.
char* codec_id_; char* codec_id_;
uint8* codec_private_; uint8* codec_private_;
char* language_; char* language_;
@@ -371,6 +372,7 @@ class Track {
uint64 uid_; uint64 uid_;
uint64 codec_delay_; uint64 codec_delay_;
uint64 seek_pre_roll_; uint64 seek_pre_roll_;
uint64 default_duration_;
// Size of the CodecPrivate data in bytes. // Size of the CodecPrivate data in bytes.
uint64 codec_private_length_; uint64 codec_private_length_;
@@ -397,10 +399,7 @@ class VideoTrack : public Track {
kSideBySideRightIsFirst = 11 kSideBySideRightIsFirst = 11
}; };
enum AlphaMode { enum AlphaMode { kNoAlpha = 0, kAlpha = 1 };
kNoAlpha = 0,
kAlpha = 1
};
// The |seed| parameter is used to synthesize a UID for the track. // The |seed| parameter is used to synthesize a UID for the track.
explicit VideoTrack(unsigned int* seed); explicit VideoTrack(unsigned int* seed);
@@ -484,10 +483,7 @@ class AudioTrack : public Track {
class Tracks { class Tracks {
public: public:
// Audio and video type defined by the Matroska specs. // Audio and video type defined by the Matroska specs.
enum { enum { kVideo = 0x1, kAudio = 0x2 };
kVideo = 0x1,
kAudio = 0x2
};
// Opus, Vorbis, VP8, and VP9 codec ids defined by the Matroska specs. // Opus, Vorbis, VP8, and VP9 codec ids defined by the Matroska specs.
static const char kOpusCodecId[]; static const char kOpusCodecId[];
static const char kVorbisCodecId[]; static const char kVorbisCodecId[];
@@ -544,8 +540,7 @@ class Chapter {
// Converts the nanosecond start and stop times of this chapter to // Converts the nanosecond start and stop times of this chapter to
// their corresponding timecode values, and stores them that way. // their corresponding timecode values, and stores them that way.
void set_time(const Segment& segment, void set_time(const Segment& segment, uint64 start_time_ns,
uint64 start_time_ns,
uint64 end_time_ns); uint64 end_time_ns);
// Sets the uid for this chapter. Primarily used to enable // Sets the uid for this chapter. Primarily used to enable
@@ -568,9 +563,7 @@ class Chapter {
// http://www.iana.org/domains/root/db/ // http://www.iana.org/domains/root/db/
// //
// The function returns false if the string could not be allocated. // The function returns false if the string could not be allocated.
bool add_string(const char* title, bool add_string(const char* title, const char* language, const char* country);
const char* language,
const char* country);
private: private:
friend class Chapters; friend class Chapters;
@@ -724,9 +717,7 @@ class Cluster {
// timecode: Absolute (not relative to cluster) timestamp of the // timecode: Absolute (not relative to cluster) timestamp of the
// frame, expressed in timecode units. // frame, expressed in timecode units.
// is_key: Flag telling whether or not this frame is a key frame. // is_key: Flag telling whether or not this frame is a key frame.
bool AddFrame(const uint8* frame, bool AddFrame(const uint8* frame, uint64 length, uint64 track_number,
uint64 length,
uint64 track_number,
uint64 timecode, // timecode units (absolute) uint64 timecode, // timecode units (absolute)
bool is_key); bool is_key);
@@ -743,14 +734,10 @@ class Cluster {
// abs_timecode: Absolute (not relative to cluster) timestamp of the // abs_timecode: Absolute (not relative to cluster) timestamp of the
// frame, expressed in timecode units. // frame, expressed in timecode units.
// is_key: Flag telling whether or not this frame is a key frame. // is_key: Flag telling whether or not this frame is a key frame.
bool AddFrameWithAdditional(const uint8* frame, bool AddFrameWithAdditional(const uint8* frame, uint64 length,
uint64 length, const uint8* additional, uint64 additional_length,
const uint8* additional, uint64 add_id, uint64 track_number,
uint64 additional_length, uint64 abs_timecode, bool is_key);
uint64 add_id,
uint64 track_number,
uint64 abs_timecode,
bool is_key);
// Adds a frame to be output in the file. The frame is written out through // Adds a frame to be output in the file. The frame is written out through
// |writer_| if successful. Returns true on success. // |writer_| if successful. Returns true on success.
@@ -763,12 +750,9 @@ class Cluster {
// abs_timecode: Absolute (not relative to cluster) timestamp of the // abs_timecode: Absolute (not relative to cluster) timestamp of the
// frame, expressed in timecode units. // frame, expressed in timecode units.
// is_key: Flag telling whether or not this frame is a key frame. // is_key: Flag telling whether or not this frame is a key frame.
bool AddFrameWithDiscardPadding(const uint8* frame, bool AddFrameWithDiscardPadding(const uint8* frame, uint64 length,
uint64 length, int64 discard_padding, uint64 track_number,
int64 discard_padding, uint64 abs_timecode, bool is_key);
uint64 track_number,
uint64 abs_timecode,
bool is_key);
// Writes a frame of metadata to the output medium; returns true on // Writes a frame of metadata to the output medium; returns true on
// success. // success.
@@ -784,11 +768,8 @@ class Cluster {
// The metadata frame is written as a block group, with a duration // The metadata frame is written as a block group, with a duration
// sub-element but no reference time sub-elements (indicating that // sub-element but no reference time sub-elements (indicating that
// it is considered a keyframe, per Matroska semantics). // it is considered a keyframe, per Matroska semantics).
bool AddMetadata(const uint8* frame, bool AddMetadata(const uint8* frame, uint64 length, uint64 track_number,
uint64 length, uint64 timecode, uint64 duration);
uint64 track_number,
uint64 timecode, // timecode units (absolute)
uint64 duration); // timecode units
// Increments the size of the cluster's data in bytes. // Increments the size of the cluster's data in bytes.
void AddPayloadSize(uint64 size); void AddPayloadSize(uint64 size);
@@ -809,34 +790,26 @@ class Cluster {
private: private:
// Signature that matches either of WriteSimpleBlock or WriteMetadataBlock // Signature that matches either of WriteSimpleBlock or WriteMetadataBlock
// in the muxer utilities package. // in the muxer utilities package.
typedef uint64 (*WriteBlock)(IMkvWriter* writer, typedef uint64 (*WriteBlock)(IMkvWriter* writer, const uint8* data,
const uint8* data, uint64 length, uint64 track_number,
uint64 length, int64 timecode, uint64 generic_arg);
uint64 track_number,
int64 timecode,
uint64 generic_arg);
// Signature that matches WriteBlockWithAdditional // Signature that matches WriteBlockWithAdditional
// in the muxer utilities package. // in the muxer utilities package.
typedef uint64 (*WriteBlockAdditional)(IMkvWriter* writer, typedef uint64 (*WriteBlockAdditional)(IMkvWriter* writer, const uint8* data,
const uint8* data, uint64 length, const uint8* additional,
uint64 length,
const uint8* additional,
uint64 add_id, uint64 add_id,
uint64 additional_length, uint64 additional_length,
uint64 track_number, uint64 track_number, int64 timecode,
int64 timecode,
uint64 is_key); uint64 is_key);
// Signature that matches WriteBlockWithDiscardPadding // Signature that matches WriteBlockWithDiscardPadding
// in the muxer utilities package. // in the muxer utilities package.
typedef uint64 (*WriteBlockDiscardPadding)(IMkvWriter* writer, typedef uint64 (*WriteBlockDiscardPadding)(IMkvWriter* writer,
const uint8* data, const uint8* data, uint64 length,
uint64 length,
int64 discard_padding, int64 discard_padding,
uint64 track_number, uint64 track_number,
int64 timecode, int64 timecode, uint64 is_key);
uint64 is_key);
// Utility method that confirms that blocks can still be added, and that the // Utility method that confirms that blocks can still be added, and that the
// cluster header has been written. Used by |DoWriteBlock*|. Returns true // cluster header has been written. Used by |DoWriteBlock*|. Returns true
@@ -858,27 +831,20 @@ class Cluster {
int64 GetRelativeTimecode(int64 abs_timecode) const; int64 GetRelativeTimecode(int64 abs_timecode) const;
// Used to implement AddFrame and AddMetadata. // Used to implement AddFrame and AddMetadata.
bool DoWriteBlock(const uint8* frame, bool DoWriteBlock(const uint8* frame, uint64 length, uint64 track_number,
uint64 length, uint64 absolute_timecode, uint64 generic_arg,
uint64 track_number,
uint64 absolute_timecode,
uint64 generic_arg,
WriteBlock write_block); WriteBlock write_block);
// Used to implement AddFrameWithAdditional // Used to implement AddFrameWithAdditional
bool DoWriteBlockWithAdditional(const uint8* frame, bool DoWriteBlockWithAdditional(const uint8* frame, uint64 length,
uint64 length,
const uint8* additional, const uint8* additional,
uint64 additional_length, uint64 additional_length, uint64 add_id,
uint64 add_id, uint64 track_number, uint64 absolute_timecode,
uint64 track_number,
uint64 absolute_timecode,
uint64 generic_arg, uint64 generic_arg,
WriteBlockAdditional write_block); WriteBlockAdditional write_block);
// Used to implement AddFrameWithDiscardPadding // Used to implement AddFrameWithDiscardPadding
bool DoWriteBlockWithDiscardPadding(const uint8* frame, bool DoWriteBlockWithDiscardPadding(const uint8* frame, uint64 length,
uint64 length,
int64 discard_padding, int64 discard_padding,
uint64 track_number, uint64 track_number,
uint64 absolute_timecode, uint64 absolute_timecode,
@@ -993,6 +959,8 @@ class SegmentInfo {
uint64 timecode_scale() const { return timecode_scale_; } uint64 timecode_scale() const { return timecode_scale_; }
void set_writing_app(const char* app); void set_writing_app(const char* app);
const char* writing_app() const { return writing_app_; } const char* writing_app() const { return writing_app_; }
void set_date_utc(int64 date_utc) { date_utc_ = date_utc; }
int64 date_utc() const { return date_utc_; }
private: private:
// Segment Information element names. // Segment Information element names.
@@ -1004,6 +972,8 @@ class SegmentInfo {
uint64 timecode_scale_; uint64 timecode_scale_;
// Initially set to libwebm-%d.%d.%d.%d, major, minor, build, revision. // Initially set to libwebm-%d.%d.%d.%d, major, minor, build, revision.
char* writing_app_; char* writing_app_;
// LLONG_MIN when DateUTC is not set.
int64 date_utc_;
// The file position of the duration element. // The file position of the duration element.
int64 duration_pos_; int64 duration_pos_;
@@ -1019,10 +989,7 @@ class SegmentInfo {
// |Init| must be called before any other method in this class. // |Init| must be called before any other method in this class.
class Segment { class Segment {
public: public:
enum Mode { enum Mode { kLive = 0x1, kFile = 0x2 };
kLive = 0x1,
kFile = 0x2
};
enum CuesPosition { enum CuesPosition {
kAfterClusters = 0x0, // Position Cues after Clusters - Default kAfterClusters = 0x0, // Position Cues after Clusters - Default
@@ -1070,11 +1037,8 @@ class Segment {
// functions. // functions.
// timestamp: Timestamp of the frame in nanoseconds from 0. // timestamp: Timestamp of the frame in nanoseconds from 0.
// is_key: Flag telling whether or not this frame is a key frame. // is_key: Flag telling whether or not this frame is a key frame.
bool AddFrame(const uint8* frame, bool AddFrame(const uint8* frame, uint64 length, uint64 track_number,
uint64 length, uint64 timestamp_ns, bool is_key);
uint64 track_number,
uint64 timestamp_ns,
bool is_key);
// Writes a frame of metadata to the output medium; returns true on // Writes a frame of metadata to the output medium; returns true on
// success. // success.
@@ -1090,11 +1054,8 @@ class Segment {
// The metadata frame is written as a block group, with a duration // The metadata frame is written as a block group, with a duration
// sub-element but no reference time sub-elements (indicating that // sub-element but no reference time sub-elements (indicating that
// it is considered a keyframe, per Matroska semantics). // it is considered a keyframe, per Matroska semantics).
bool AddMetadata(const uint8* frame, bool AddMetadata(const uint8* frame, uint64 length, uint64 track_number,
uint64 length, uint64 timestamp_ns, uint64 duration_ns);
uint64 track_number,
uint64 timestamp_ns,
uint64 duration_ns);
// Writes a frame with additional data to the output medium; returns true on // Writes a frame with additional data to the output medium; returns true on
// success. // success.
@@ -1109,14 +1070,10 @@ class Segment {
// timestamp: Absolute timestamp of the frame, expressed in nanosecond // timestamp: Absolute timestamp of the frame, expressed in nanosecond
// units. // units.
// is_key: Flag telling whether or not this frame is a key frame. // is_key: Flag telling whether or not this frame is a key frame.
bool AddFrameWithAdditional(const uint8* frame, bool AddFrameWithAdditional(const uint8* frame, uint64 length,
uint64 length, const uint8* additional, uint64 additional_length,
const uint8* additional, uint64 add_id, uint64 track_number,
uint64 additional_length, uint64 timestamp, bool is_key);
uint64 add_id,
uint64 track_number,
uint64 timestamp,
bool is_key);
// Writes a frame with DiscardPadding to the output medium; returns true on // Writes a frame with DiscardPadding to the output medium; returns true on
// success. // success.
@@ -1129,12 +1086,9 @@ class Segment {
// timestamp: Absolute timestamp of the frame, expressed in nanosecond // timestamp: Absolute timestamp of the frame, expressed in nanosecond
// units. // units.
// is_key: Flag telling whether or not this frame is a key frame. // is_key: Flag telling whether or not this frame is a key frame.
bool AddFrameWithDiscardPadding(const uint8* frame, bool AddFrameWithDiscardPadding(const uint8* frame, uint64 length,
uint64 length, int64 discard_padding, uint64 track_number,
int64 discard_padding, uint64 timestamp, bool is_key);
uint64 track_number,
uint64 timestamp,
bool is_key);
// Writes a Frame to the output medium. Chooses the correct way of writing // Writes a Frame to the output medium. Chooses the correct way of writing
// the frame (Block vs SimpleBlock) based on the parameters passed. // the frame (Block vs SimpleBlock) based on the parameters passed.
@@ -1268,7 +1222,6 @@ class Segment {
// was necessary but creation was not successful. // was necessary but creation was not successful.
bool DoNewClusterProcessing(uint64 track_num, uint64 timestamp_ns, bool key); bool DoNewClusterProcessing(uint64 track_num, uint64 timestamp_ns, bool key);
// Adjusts Cue Point values (to place Cues before Clusters) so that they // Adjusts Cue Point values (to place Cues before Clusters) so that they
// reflect the correct offsets. // reflect the correct offsets.
void MoveCuesBeforeClusters(); void MoveCuesBeforeClusters();

View File

@@ -29,6 +29,13 @@
namespace mkvmuxer { namespace mkvmuxer {
namespace {
// Date elements are always 8 octets in size.
const int kDateElementSize = 8;
} // namespace
int32 GetCodedUIntSize(uint64 value) { int32 GetCodedUIntSize(uint64 value) {
if (value < 0x000000000000007FULL) if (value < 0x000000000000007FULL)
return 1; return 1;
@@ -137,6 +144,19 @@ uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size) {
return ebml_size; return ebml_size;
} }
uint64 EbmlDateElementSize(uint64 type, int64 value) {
// Size of EBML ID
uint64 ebml_size = GetUIntSize(type);
// Datasize
ebml_size += kDateElementSize;
// Size of Datasize
ebml_size++;
return ebml_size;
}
int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) { int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) {
if (!writer || size < 1 || size > 8) if (!writer || size < 1 || size > 8)
return -1; return -1;
@@ -302,9 +322,7 @@ bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value) {
return true; return true;
} }
bool WriteEbmlElement(IMkvWriter* writer, bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value,
uint64 type,
const uint8* value,
uint64 size) { uint64 size) {
if (!writer || !value || size < 1) if (!writer || !value || size < 1)
return false; return false;
@@ -321,12 +339,24 @@ bool WriteEbmlElement(IMkvWriter* writer,
return true; return true;
} }
uint64 WriteSimpleBlock(IMkvWriter* writer, bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value) {
const uint8* data, if (!writer)
uint64 length, return false;
uint64 track_number,
int64 timecode, if (WriteID(writer, type))
uint64 is_key) { return false;
if (WriteUInt(writer, kDateElementSize))
return false;
if (SerializeInt(writer, value, kDateElementSize))
return false;
return true;
}
uint64 WriteSimpleBlock(IMkvWriter* writer, const uint8* data, uint64 length,
uint64 track_number, int64 timecode, uint64 is_key) {
if (!writer) if (!writer)
return false; return false;
@@ -391,11 +421,8 @@ uint64 WriteSimpleBlock(IMkvWriter* writer,
// Duration size // Duration size
// (duration payload) // (duration payload)
// //
uint64 WriteMetadataBlock(IMkvWriter* writer, uint64 WriteMetadataBlock(IMkvWriter* writer, const uint8* data, uint64 length,
const uint8* data, uint64 track_number, int64 timecode,
uint64 length,
uint64 track_number,
int64 timecode,
uint64 duration) { uint64 duration) {
// We don't backtrack when writing to the stream, so we must // We don't backtrack when writing to the stream, so we must
// pre-compute the BlockGroup size, by summing the sizes of each // pre-compute the BlockGroup size, by summing the sizes of each
@@ -487,47 +514,37 @@ uint64 WriteMetadataBlock(IMkvWriter* writer,
// 1 (Denotes Alpha) // 1 (Denotes Alpha)
// BlockAdditional // BlockAdditional
// Data // Data
uint64 WriteBlockWithAdditional(IMkvWriter* writer, uint64 WriteBlockWithAdditional(IMkvWriter* writer, const uint8* data,
const uint8* data, uint64 length, const uint8* additional,
uint64 length, uint64 additional_length, uint64 add_id,
const uint8* additional, uint64 track_number, int64 timecode,
uint64 additional_length,
uint64 add_id,
uint64 track_number,
int64 timecode,
uint64 is_key) { uint64 is_key) {
if (!data || !additional || length < 1 || additional_length < 1) if (!data || !additional || length < 1 || additional_length < 1)
return 0; return 0;
const uint64 block_payload_size = 4 + length; const uint64 block_payload_size = 4 + length;
const uint64 block_elem_size = EbmlMasterElementSize(kMkvBlock, const uint64 block_elem_size =
block_payload_size) + EbmlMasterElementSize(kMkvBlock, block_payload_size) + block_payload_size;
block_payload_size; const uint64 block_additional_elem_size =
const uint64 block_additional_elem_size = EbmlElementSize(kMkvBlockAdditional, EbmlElementSize(kMkvBlockAdditional, additional, additional_length);
additional,
additional_length);
const uint64 block_addid_elem_size = EbmlElementSize(kMkvBlockAddID, add_id); const uint64 block_addid_elem_size = EbmlElementSize(kMkvBlockAddID, add_id);
const uint64 block_more_payload_size = block_addid_elem_size + const uint64 block_more_payload_size =
block_additional_elem_size; block_addid_elem_size + block_additional_elem_size;
const uint64 block_more_elem_size = EbmlMasterElementSize( const uint64 block_more_elem_size =
kMkvBlockMore, EbmlMasterElementSize(kMkvBlockMore, block_more_payload_size) +
block_more_payload_size) +
block_more_payload_size; block_more_payload_size;
const uint64 block_additions_payload_size = block_more_elem_size; const uint64 block_additions_payload_size = block_more_elem_size;
const uint64 block_additions_elem_size = EbmlMasterElementSize( const uint64 block_additions_elem_size =
kMkvBlockAdditions, EbmlMasterElementSize(kMkvBlockAdditions, block_additions_payload_size) +
block_additions_payload_size) +
block_additions_payload_size; block_additions_payload_size;
const uint64 block_group_payload_size = block_elem_size + const uint64 block_group_payload_size =
block_additions_elem_size; block_elem_size + block_additions_elem_size;
const uint64 block_group_elem_size = EbmlMasterElementSize( const uint64 block_group_elem_size =
kMkvBlockGroup, EbmlMasterElementSize(kMkvBlockGroup, block_group_payload_size) +
block_group_payload_size) +
block_group_payload_size; block_group_payload_size;
if (!WriteEbmlMasterElement(writer, kMkvBlockGroup, if (!WriteEbmlMasterElement(writer, kMkvBlockGroup, block_group_payload_size))
block_group_payload_size))
return 0; return 0;
if (!WriteEbmlMasterElement(writer, kMkvBlock, block_payload_size)) if (!WriteEbmlMasterElement(writer, kMkvBlock, block_payload_size))
@@ -558,8 +575,8 @@ uint64 WriteBlockWithAdditional(IMkvWriter* writer,
if (!WriteEbmlElement(writer, kMkvBlockAddID, add_id)) if (!WriteEbmlElement(writer, kMkvBlockAddID, add_id))
return 0; return 0;
if (!WriteEbmlElement(writer, kMkvBlockAdditional, if (!WriteEbmlElement(writer, kMkvBlockAdditional, additional,
additional, additional_length)) additional_length))
return 0; return 0;
return block_group_elem_size; return block_group_elem_size;
@@ -571,31 +588,25 @@ uint64 WriteBlockWithAdditional(IMkvWriter* writer,
// Block // Block
// Data // Data
// DiscardPadding // DiscardPadding
uint64 WriteBlockWithDiscardPadding(IMkvWriter* writer, uint64 WriteBlockWithDiscardPadding(IMkvWriter* writer, const uint8* data,
const uint8* data, uint64 length, int64 discard_padding,
uint64 length, uint64 track_number, int64 timecode,
int64 discard_padding,
uint64 track_number,
int64 timecode,
uint64 is_key) { uint64 is_key) {
if (!data || length < 1 || discard_padding <= 0) if (!data || length < 1 || discard_padding <= 0)
return 0; return 0;
const uint64 block_payload_size = 4 + length; const uint64 block_payload_size = 4 + length;
const uint64 block_elem_size = EbmlMasterElementSize(kMkvBlock, const uint64 block_elem_size =
block_payload_size) + EbmlMasterElementSize(kMkvBlock, block_payload_size) + block_payload_size;
block_payload_size; const uint64 discard_padding_elem_size =
const uint64 discard_padding_elem_size = EbmlElementSize(kMkvDiscardPadding, EbmlElementSize(kMkvDiscardPadding, discard_padding);
discard_padding); const uint64 block_group_payload_size =
const uint64 block_group_payload_size = block_elem_size + block_elem_size + discard_padding_elem_size;
discard_padding_elem_size; const uint64 block_group_elem_size =
const uint64 block_group_elem_size = EbmlMasterElementSize( EbmlMasterElementSize(kMkvBlockGroup, block_group_payload_size) +
kMkvBlockGroup,
block_group_payload_size) +
block_group_payload_size; block_group_payload_size;
if (!WriteEbmlMasterElement(writer, kMkvBlockGroup, if (!WriteEbmlMasterElement(writer, kMkvBlockGroup, block_group_payload_size))
block_group_payload_size))
return 0; return 0;
if (!WriteEbmlMasterElement(writer, kMkvBlock, block_payload_size)) if (!WriteEbmlMasterElement(writer, kMkvBlock, block_payload_size))
@@ -635,8 +646,8 @@ uint64 WriteVoidElement(IMkvWriter* writer, uint64 size) {
// Subtract one for the void ID and the coded size. // Subtract one for the void ID and the coded size.
uint64 void_entry_size = size - 1 - GetCodedUIntSize(size - 1); uint64 void_entry_size = size - 1 - GetCodedUIntSize(size - 1);
uint64 void_size = EbmlMasterElementSize(kMkvVoid, void_entry_size) + uint64 void_size =
void_entry_size; EbmlMasterElementSize(kMkvVoid, void_entry_size) + void_entry_size;
if (void_size != size) if (void_size != size)
return 0; return 0;

View File

@@ -30,6 +30,7 @@ uint64 EbmlElementSize(uint64 type, uint64 value);
uint64 EbmlElementSize(uint64 type, float value); uint64 EbmlElementSize(uint64 type, float value);
uint64 EbmlElementSize(uint64 type, const char* value); uint64 EbmlElementSize(uint64 type, const char* value);
uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size); uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size);
uint64 EbmlDateElementSize(uint64 type, int64 value);
// Creates an EBML coded number from |value| and writes it out. The size of // Creates an EBML coded number from |value| and writes it out. The size of
// the coded number is determined by the value of |value|. |value| must not // the coded number is determined by the value of |value|. |value| must not
@@ -52,10 +53,9 @@ int32 WriteID(IMkvWriter* writer, uint64 type);
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value); bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value);
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value); bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value);
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value); bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value);
bool WriteEbmlElement(IMkvWriter* writer, bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value,
uint64 type,
const uint8* value,
uint64 size); uint64 size);
bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value);
// Output an Mkv Simple Block. // Output an Mkv Simple Block.
// Inputs: // Inputs:
@@ -67,12 +67,8 @@ bool WriteEbmlElement(IMkvWriter* writer,
// timecode: Relative timecode of the Block. Only values in the // timecode: Relative timecode of the Block. Only values in the
// range [0, 2^15) are permitted. // range [0, 2^15) are permitted.
// is_key: Non-zero value specifies that frame is a key frame. // is_key: Non-zero value specifies that frame is a key frame.
uint64 WriteSimpleBlock(IMkvWriter* writer, uint64 WriteSimpleBlock(IMkvWriter* writer, const uint8* data, uint64 length,
const uint8* data, uint64 track_number, int64 timecode, uint64 is_key);
uint64 length,
uint64 track_number,
int64 timecode,
uint64 is_key);
// Output a metadata keyframe, using a Block Group element. // Output a metadata keyframe, using a Block Group element.
// Inputs: // Inputs:
@@ -84,11 +80,8 @@ uint64 WriteSimpleBlock(IMkvWriter* writer,
// timecode Timecode of frame, relative to cluster timecode. Only // timecode Timecode of frame, relative to cluster timecode. Only
// values in the range [0, 2^15) are permitted. // values in the range [0, 2^15) are permitted.
// duration_timecode Duration of frame, using timecode units. // duration_timecode Duration of frame, using timecode units.
uint64 WriteMetadataBlock(IMkvWriter* writer, uint64 WriteMetadataBlock(IMkvWriter* writer, const uint8* data, uint64 length,
const uint8* data, uint64 track_number, int64 timecode,
uint64 length,
uint64 track_number,
int64 timecode,
uint64 duration_timecode); uint64 duration_timecode);
// Output an Mkv Block with BlockAdditional data. // Output an Mkv Block with BlockAdditional data.
@@ -104,14 +97,10 @@ uint64 WriteMetadataBlock(IMkvWriter* writer,
// timecode: Relative timecode of the Block. Only values in the // timecode: Relative timecode of the Block. Only values in the
// range [0, 2^15) are permitted. // range [0, 2^15) are permitted.
// is_key: Non-zero value specifies that frame is a key frame. // is_key: Non-zero value specifies that frame is a key frame.
uint64 WriteBlockWithAdditional(IMkvWriter* writer, uint64 WriteBlockWithAdditional(IMkvWriter* writer, const uint8* data,
const uint8* data, uint64 length, const uint8* additional,
uint64 length, uint64 additional_length, uint64 add_id,
const uint8* additional, uint64 track_number, int64 timecode,
uint64 additional_length,
uint64 add_id,
uint64 track_number,
int64 timecode,
uint64 is_key); uint64 is_key);
// Output an Mkv Block with a DiscardPadding element. // Output an Mkv Block with a DiscardPadding element.
@@ -125,12 +114,9 @@ uint64 WriteBlockWithAdditional(IMkvWriter* writer,
// timecode: Relative timecode of the Block. Only values in the // timecode: Relative timecode of the Block. Only values in the
// range [0, 2^15) are permitted. // range [0, 2^15) are permitted.
// is_key: Non-zero value specifies that frame is a key frame. // is_key: Non-zero value specifies that frame is a key frame.
uint64 WriteBlockWithDiscardPadding(IMkvWriter* writer, uint64 WriteBlockWithDiscardPadding(IMkvWriter* writer, const uint8* data,
const uint8* data, uint64 length, int64 discard_padding,
uint64 length, uint64 track_number, int64 timecode,
int64 discard_padding,
uint64 track_number,
int64 timecode,
uint64 is_key); uint64 is_key);
// Output a void element. |size| must be the entire size in bytes that will be // Output a void element. |size| must be the entire size in bytes that will be

File diff suppressed because it is too large Load Diff

View File

@@ -13,17 +13,16 @@
#include <cstdio> #include <cstdio>
#include <cstddef> #include <cstddef>
namespace mkvparser namespace mkvparser {
{
const int E_FILE_FORMAT_INVALID = -2; const int E_FILE_FORMAT_INVALID = -2;
const int E_BUFFER_NOT_FULL = -3; const int E_BUFFER_NOT_FULL = -3;
class IMkvReader class IMkvReader {
{
public: public:
virtual int Read(long long pos, long len, unsigned char* buf) = 0; virtual int Read(long long pos, long len, unsigned char* buf) = 0;
virtual int Length(long long* total, long long* available) = 0; virtual int Length(long long* total, long long* available) = 0;
protected: protected:
virtual ~IMkvReader(); virtual ~IMkvReader();
}; };
@@ -35,26 +34,19 @@ long long UnserializeUInt(IMkvReader*, long long pos, long long size);
long UnserializeFloat(IMkvReader*, long long pos, long long size, double&); long UnserializeFloat(IMkvReader*, long long pos, long long size, double&);
long UnserializeInt(IMkvReader*, long long pos, long len, long long& result); long UnserializeInt(IMkvReader*, long long pos, long len, long long& result);
long UnserializeString( long UnserializeString(IMkvReader*, long long pos, long long size, char*& str);
IMkvReader*,
long long pos,
long long size,
char*& str);
long ParseElementHeader( long ParseElementHeader(IMkvReader* pReader,
IMkvReader* pReader,
long long& pos, // consume id and size fields long long& pos, // consume id and size fields
long long stop, // if you know size of element's parent long long stop, // if you know size of element's parent
long long& id, long long& id, long long& size);
long long& size);
bool Match(IMkvReader*, long long&, unsigned long, long long&); bool Match(IMkvReader*, long long&, unsigned long, long long&);
bool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&); bool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&);
void GetVersion(int& major, int& minor, int& build, int& revision); void GetVersion(int& major, int& minor, int& build, int& revision);
struct EBMLHeader struct EBMLHeader {
{
EBMLHeader(); EBMLHeader();
~EBMLHeader(); ~EBMLHeader();
long long m_version; long long m_version;
@@ -69,13 +61,11 @@ struct EBMLHeader
void Init(); void Init();
}; };
class Segment; class Segment;
class Track; class Track;
class Cluster; class Cluster;
class Block class Block {
{
Block(const Block&); Block(const Block&);
Block& operator=(const Block&); Block& operator=(const Block&);
@@ -100,8 +90,7 @@ public:
int GetFrameCount() const; // to index frames: [0, count) int GetFrameCount() const; // to index frames: [0, count)
struct Frame struct Frame {
{
long long pos; // absolute offset long long pos; // absolute offset
long len; long len;
@@ -124,9 +113,7 @@ protected:
const long long m_discard_padding; const long long m_discard_padding;
}; };
class BlockEntry {
class BlockEntry
{
BlockEntry(const BlockEntry&); BlockEntry(const BlockEntry&);
BlockEntry& operator=(const BlockEntry&); BlockEntry& operator=(const BlockEntry&);
@@ -147,12 +134,9 @@ public:
protected: protected:
Cluster* const m_pCluster; Cluster* const m_pCluster;
const long m_index; const long m_index;
}; };
class SimpleBlock : public BlockEntry {
class SimpleBlock : public BlockEntry
{
SimpleBlock(const SimpleBlock&); SimpleBlock(const SimpleBlock&);
SimpleBlock& operator=(const SimpleBlock&); SimpleBlock& operator=(const SimpleBlock&);
@@ -165,24 +149,17 @@ public:
protected: protected:
Block m_block; Block m_block;
}; };
class BlockGroup : public BlockEntry {
class BlockGroup : public BlockEntry
{
BlockGroup(const BlockGroup&); BlockGroup(const BlockGroup&);
BlockGroup& operator=(const BlockGroup&); BlockGroup& operator=(const BlockGroup&);
public: public:
BlockGroup( BlockGroup(Cluster*, long index,
Cluster*,
long index,
long long block_start, // absolute pos of block's payload long long block_start, // absolute pos of block's payload
long long block_size, // size of block's payload long long block_size, // size of block's payload
long long prev, long long prev, long long next, long long duration,
long long next,
long long duration,
long long discard_padding); long long discard_padding);
long Parse(); long Parse();
@@ -207,9 +184,7 @@ private:
// compressed with zlib or header stripping. // compressed with zlib or header stripping.
class ContentEncoding { class ContentEncoding {
public: public:
enum { enum { kCTR = 1 };
kCTR = 1
};
ContentEncoding(); ContentEncoding();
~ContentEncoding(); ~ContentEncoding();
@@ -262,8 +237,7 @@ public:
// starting offset of the ContentCompression payload. |size| is the size in // starting offset of the ContentCompression payload. |size| is the size in
// bytes of the ContentCompression payload. |compression| is where the parsed // bytes of the ContentCompression payload. |compression| is where the parsed
// values will be stored. // values will be stored.
long ParseCompressionEntry(long long start, long ParseCompressionEntry(long long start, long long size,
long long size,
IMkvReader* pReader, IMkvReader* pReader,
ContentCompression* compression); ContentCompression* compression);
@@ -279,26 +253,22 @@ public:
// starting offset of the ContentEncAESSettings payload. |size| is the // starting offset of the ContentEncAESSettings payload. |size| is the
// size in bytes of the ContentEncAESSettings payload. |encryption| is // size in bytes of the ContentEncAESSettings payload. |encryption| is
// where the parsed values will be stored. // where the parsed values will be stored.
long ParseContentEncAESSettingsEntry(long long start, long ParseContentEncAESSettingsEntry(long long start, long long size,
long long size,
IMkvReader* pReader, IMkvReader* pReader,
ContentEncAESSettings* aes); ContentEncAESSettings* aes);
// Parses the ContentEncoding element from |pReader|. |start| is the // Parses the ContentEncoding element from |pReader|. |start| is the
// starting offset of the ContentEncoding payload. |size| is the size in // starting offset of the ContentEncoding payload. |size| is the size in
// bytes of the ContentEncoding payload. Returns true on success. // bytes of the ContentEncoding payload. Returns true on success.
long ParseContentEncodingEntry(long long start, long ParseContentEncodingEntry(long long start, long long size,
long long size,
IMkvReader* pReader); IMkvReader* pReader);
// Parses the ContentEncryption element from |pReader|. |start| is the // Parses the ContentEncryption element from |pReader|. |start| is the
// starting offset of the ContentEncryption payload. |size| is the size in // starting offset of the ContentEncryption payload. |size| is the size in
// bytes of the ContentEncryption payload. |encryption| is where the parsed // bytes of the ContentEncryption payload. |encryption| is where the parsed
// values will be stored. // values will be stored.
long ParseEncryptionEntry(long long start, long ParseEncryptionEntry(long long start, long long size,
long long size, IMkvReader* pReader, ContentEncryption* encryption);
IMkvReader* pReader,
ContentEncryption* encryption);
unsigned long long encoding_order() const { return encoding_order_; } unsigned long long encoding_order() const { return encoding_order_; }
unsigned long long encoding_scope() const { return encoding_scope_; } unsigned long long encoding_scope() const { return encoding_scope_; }
@@ -323,26 +293,16 @@ private:
ContentEncoding& operator=(const ContentEncoding&); ContentEncoding& operator=(const ContentEncoding&);
}; };
class Track class Track {
{
Track(const Track&); Track(const Track&);
Track& operator=(const Track&); Track& operator=(const Track&);
public: public:
class Info; class Info;
static long Create( static long Create(Segment*, const Info&, long long element_start,
Segment*, long long element_size, Track*&);
const Info&,
long long element_start,
long long element_size,
Track*&);
enum Type { enum Type { kVideo = 1, kAudio = 2, kSubtitle = 0x11, kMetadata = 0x21 };
kVideo = 1,
kAudio = 2,
kSubtitle = 0x11,
kMetadata = 0x21
};
Segment* const m_pSegment; Segment* const m_pSegment;
const long long m_element_start; const long long m_element_start;
@@ -364,14 +324,12 @@ public:
const BlockEntry* GetEOS() const; const BlockEntry* GetEOS() const;
struct Settings struct Settings {
{
long long start; long long start;
long long size; long long size;
}; };
class Info class Info {
{
public: public:
Info(); Info();
~Info(); ~Info();
@@ -409,15 +367,11 @@ public:
long ParseContentEncodingsEntry(long long start, long long size); long ParseContentEncodingsEntry(long long start, long long size);
protected: protected:
Track( Track(Segment*, long long element_start, long long element_size);
Segment*,
long long element_start,
long long element_size);
Info m_info; Info m_info;
class EOSBlock : public BlockEntry class EOSBlock : public BlockEntry {
{
public: public:
EOSBlock(); EOSBlock();
@@ -432,24 +386,15 @@ private:
ContentEncoding** content_encoding_entries_end_; ContentEncoding** content_encoding_entries_end_;
}; };
class VideoTrack : public Track {
class VideoTrack : public Track
{
VideoTrack(const VideoTrack&); VideoTrack(const VideoTrack&);
VideoTrack& operator=(const VideoTrack&); VideoTrack& operator=(const VideoTrack&);
VideoTrack( VideoTrack(Segment*, long long element_start, long long element_size);
Segment*,
long long element_start,
long long element_size);
public: public:
static long Parse( static long Parse(Segment*, const Info&, long long element_start,
Segment*, long long element_size, VideoTrack*&);
const Info&,
long long element_start,
long long element_size,
VideoTrack*&);
long long GetWidth() const; long long GetWidth() const;
long long GetHeight() const; long long GetHeight() const;
@@ -462,26 +407,17 @@ private:
long long m_width; long long m_width;
long long m_height; long long m_height;
double m_rate; double m_rate;
}; };
class AudioTrack : public Track {
class AudioTrack : public Track
{
AudioTrack(const AudioTrack&); AudioTrack(const AudioTrack&);
AudioTrack& operator=(const AudioTrack&); AudioTrack& operator=(const AudioTrack&);
AudioTrack( AudioTrack(Segment*, long long element_start, long long element_size);
Segment*,
long long element_start,
long long element_size);
public: public:
static long Parse( static long Parse(Segment*, const Info&, long long element_start,
Segment*, long long element_size, AudioTrack*&);
const Info&,
long long element_start,
long long element_size,
AudioTrack*&);
double GetSamplingRate() const; double GetSamplingRate() const;
long long GetChannels() const; long long GetChannels() const;
@@ -493,9 +429,7 @@ private:
long long m_bitDepth; long long m_bitDepth;
}; };
class Tracks {
class Tracks
{
Tracks(const Tracks&); Tracks(const Tracks&);
Tracks& operator=(const Tracks&); Tracks& operator=(const Tracks&);
@@ -506,11 +440,7 @@ public:
const long long m_element_start; const long long m_element_start;
const long long m_element_size; const long long m_element_size;
Tracks( Tracks(Segment*, long long start, long long size, long long element_start,
Segment*,
long long start,
long long size,
long long element_start,
long long element_size); long long element_size);
~Tracks(); ~Tracks();
@@ -526,18 +456,12 @@ private:
Track** m_trackEntries; Track** m_trackEntries;
Track** m_trackEntriesEnd; Track** m_trackEntriesEnd;
long ParseTrackEntry( long ParseTrackEntry(long long payload_start, long long payload_size,
long long payload_start, long long element_start, long long element_size,
long long payload_size,
long long element_start,
long long element_size,
Track*&) const; Track*&) const;
}; };
class Chapters {
class Chapters
{
Chapters(const Chapters&); Chapters(const Chapters&);
Chapters& operator=(const Chapters&); Chapters& operator=(const Chapters&);
@@ -548,12 +472,8 @@ public:
const long long m_element_start; const long long m_element_start;
const long long m_element_size; const long long m_element_size;
Chapters( Chapters(Segment*, long long payload_start, long long payload_size,
Segment*, long long element_start, long long element_size);
long long payload_start,
long long payload_size,
long long element_start,
long long element_size);
~Chapters(); ~Chapters();
@@ -562,17 +482,18 @@ public:
class Atom; class Atom;
class Edition; class Edition;
class Display class Display {
{
friend class Atom; friend class Atom;
Display(); Display();
Display(const Display&); Display(const Display&);
~Display(); ~Display();
Display& operator=(const Display&); Display& operator=(const Display&);
public: public:
const char* GetString() const; const char* GetString() const;
const char* GetLanguage() const; const char* GetLanguage() const;
const char* GetCountry() const; const char* GetCountry() const;
private: private:
void Init(); void Init();
void ShallowCopy(Display&) const; void ShallowCopy(Display&) const;
@@ -584,13 +505,13 @@ public:
char* m_country; char* m_country;
}; };
class Atom class Atom {
{
friend class Edition; friend class Edition;
Atom(); Atom();
Atom(const Atom&); Atom(const Atom&);
~Atom(); ~Atom();
Atom& operator=(const Atom&); Atom& operator=(const Atom&);
public: public:
unsigned long long GetUID() const; unsigned long long GetUID() const;
const char* GetStringUID() const; const char* GetStringUID() const;
@@ -603,6 +524,7 @@ public:
int GetDisplayCount() const; int GetDisplayCount() const;
const Display* GetDisplay(int index) const; const Display* GetDisplay(int index) const;
private: private:
void Init(); void Init();
void ShallowCopy(Atom&) const; void ShallowCopy(Atom&) const;
@@ -623,16 +545,17 @@ public:
int m_displays_count; int m_displays_count;
}; };
class Edition class Edition {
{
friend class Chapters; friend class Chapters;
Edition(); Edition();
Edition(const Edition&); Edition(const Edition&);
~Edition(); ~Edition();
Edition& operator=(const Edition&); Edition& operator=(const Edition&);
public: public:
int GetAtomCount() const; int GetAtomCount() const;
const Atom* GetAtom(int index) const; const Atom* GetAtom(int index) const;
private: private:
void Init(); void Init();
void ShallowCopy(Edition&) const; void ShallowCopy(Edition&) const;
@@ -657,12 +580,9 @@ private:
Edition* m_editions; Edition* m_editions;
int m_editions_size; int m_editions_size;
int m_editions_count; int m_editions_count;
}; };
class SegmentInfo {
class SegmentInfo
{
SegmentInfo(const SegmentInfo&); SegmentInfo(const SegmentInfo&);
SegmentInfo& operator=(const SegmentInfo&); SegmentInfo& operator=(const SegmentInfo&);
@@ -673,12 +593,8 @@ public:
const long long m_element_start; const long long m_element_start;
const long long m_element_size; const long long m_element_size;
SegmentInfo( SegmentInfo(Segment*, long long start, long long size,
Segment*, long long element_start, long long element_size);
long long start,
long long size,
long long element_start,
long long element_size);
~SegmentInfo(); ~SegmentInfo();
@@ -698,9 +614,7 @@ private:
char* m_pTitleAsUTF8; char* m_pTitleAsUTF8;
}; };
class SeekHead {
class SeekHead
{
SeekHead(const SeekHead&); SeekHead(const SeekHead&);
SeekHead& operator=(const SeekHead&); SeekHead& operator=(const SeekHead&);
@@ -711,19 +625,14 @@ public:
const long long m_element_start; const long long m_element_start;
const long long m_element_size; const long long m_element_size;
SeekHead( SeekHead(Segment*, long long start, long long size, long long element_start,
Segment*,
long long start,
long long size,
long long element_start,
long long element_size); long long element_size);
~SeekHead(); ~SeekHead();
long Parse(); long Parse();
struct Entry struct Entry {
{
// the SeekHead entry payload // the SeekHead entry payload
long long id; long long id;
long long pos; long long pos;
@@ -738,8 +647,7 @@ public:
int GetCount() const; int GetCount() const;
const Entry* GetEntry(int idx) const; const Entry* GetEntry(int idx) const;
struct VoidElement struct VoidElement {
{
// absolute pos of Void ID // absolute pos of Void ID
long long element_start; long long element_start;
@@ -757,17 +665,13 @@ private:
VoidElement* m_void_elements; VoidElement* m_void_elements;
int m_void_element_count; int m_void_element_count;
static bool ParseEntry( static bool ParseEntry(IMkvReader*,
IMkvReader*,
long long pos, // payload long long pos, // payload
long long size, long long size, Entry*);
Entry*);
}; };
class Cues; class Cues;
class CuePoint class CuePoint {
{
friend class Cues; friend class Cues;
CuePoint(long, long long); CuePoint(long, long long);
@@ -785,8 +689,7 @@ public:
long long GetTimeCode() const; // absolute but unscaled long long GetTimeCode() const; // absolute but unscaled
long long GetTime(const Segment*) const; // absolute and scaled (ns units) long long GetTime(const Segment*) const; // absolute and scaled (ns units)
struct TrackPosition struct TrackPosition {
{
long long m_track; long long m_track;
long long m_pos; // of cluster long long m_pos; // of cluster
long long m_block; long long m_block;
@@ -804,19 +707,12 @@ private:
long long m_timecode; long long m_timecode;
TrackPosition* m_track_positions; TrackPosition* m_track_positions;
size_t m_track_positions_count; size_t m_track_positions_count;
}; };
class Cues {
class Cues
{
friend class Segment; friend class Segment;
Cues( Cues(Segment*, long long start, long long size, long long element_start,
Segment*,
long long start,
long long size,
long long element_start,
long long element_size); long long element_size);
~Cues(); ~Cues();
@@ -831,9 +727,7 @@ public:
const long long m_element_size; 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, const Track*, const CuePoint*&,
const Track*,
const CuePoint*&,
const CuePoint::TrackPosition*&) const; const CuePoint::TrackPosition*&) const;
#if 0 #if 0
@@ -848,8 +742,7 @@ public:
const CuePoint* GetLast() const; const CuePoint* GetLast() const;
const CuePoint* GetNext(const CuePoint*) const; const CuePoint* GetNext(const CuePoint*) const;
const BlockEntry* GetBlock( const BlockEntry* GetBlock(const CuePoint*,
const CuePoint*,
const CuePoint::TrackPosition*) const; const CuePoint::TrackPosition*) const;
bool LoadCuePoint() const; bool LoadCuePoint() const;
@@ -865,12 +758,9 @@ private:
mutable long m_count; mutable long m_count;
mutable long m_preload_count; mutable long m_preload_count;
mutable long long m_pos; mutable long long m_pos;
}; };
class Cluster {
class Cluster
{
friend class Segment; friend class Segment;
Cluster(const Cluster&); Cluster(const Cluster&);
@@ -880,8 +770,7 @@ public:
Segment* const m_pSegment; Segment* const m_pSegment;
public: public:
static Cluster* Create( static Cluster* Create(Segment*,
Segment*,
long index, // index in segment long index, // index in segment
long long off); // offset relative to segment long long off); // offset relative to segment
// long long element_size); // long long element_size);
@@ -901,17 +790,13 @@ public:
long GetNext(const BlockEntry* curr, const BlockEntry*& next) const; long GetNext(const BlockEntry* curr, const BlockEntry*& next) const;
const BlockEntry* GetEntry(const Track*, long long ns = -1) const; const BlockEntry* GetEntry(const Track*, long long ns = -1) const;
const BlockEntry* GetEntry( const BlockEntry* GetEntry(const CuePoint&,
const CuePoint&,
const CuePoint::TrackPosition&) const; const CuePoint::TrackPosition&) const;
// const BlockEntry* GetMaxKey(const VideoTrack*) const; // const BlockEntry* GetMaxKey(const VideoTrack*) const;
// static bool HasBlockEntries(const Segment*, long long); // static bool HasBlockEntries(const Segment*, long long);
static long HasBlockEntries( static long HasBlockEntries(const Segment*, long long idoff, long long& pos,
const Segment*,
long long idoff,
long long& pos,
long& size); long& size);
long GetEntryCount() const; long GetEntryCount() const;
@@ -922,10 +807,7 @@ public:
long GetEntry(long index, const mkvparser::BlockEntry*&) const; long GetEntry(long index, const mkvparser::BlockEntry*&) const;
protected: protected:
Cluster( Cluster(Segment*, long index, long long element_start);
Segment*,
long index,
long long element_start);
// long long element_size); // long long element_size);
public: public:
@@ -956,12 +838,9 @@ private:
long CreateBlockGroup(long long start_offset, long long size, long CreateBlockGroup(long long start_offset, long long size,
long long discard_padding); long long discard_padding);
long CreateSimpleBlock(long long, long long); long CreateSimpleBlock(long long, long long);
}; };
class Segment {
class Segment
{
friend class Cues; friend class Cues;
friend class Track; friend class Track;
friend class VideoTrack; friend class VideoTrack;
@@ -970,12 +849,9 @@ class Segment
Segment& operator=(const Segment&); Segment& operator=(const Segment&);
private: private:
Segment( Segment(IMkvReader*, long long elem_start,
IMkvReader*,
long long elem_start,
// long long elem_size, // long long elem_size,
long long pos, long long pos, long long size);
long long size);
public: public:
IMkvReader* const m_pReader; IMkvReader* const m_pReader;
@@ -998,10 +874,7 @@ 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( long ParseNext(const Cluster* pCurr, const Cluster*& pNext, long long& pos,
const Cluster* pCurr,
const Cluster*& pNext,
long long& pos,
long& size); long& size);
#if 0 #if 0
@@ -1029,13 +902,10 @@ public:
const Cluster* FindOrPreloadCluster(long long pos); const Cluster* FindOrPreloadCluster(long long pos);
long ParseCues( long ParseCues(long long cues_off, // offset relative to start of segment
long long cues_off, //offset relative to start of segment long long& parse_pos, long& parse_len);
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
Cluster* m_pUnknownSize; Cluster* m_pUnknownSize;
@@ -1060,16 +930,12 @@ private:
// 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::TrackPosition&);
const CuePoint&,
const CuePoint::TrackPosition&);
}; };
} // end namespace mkvparser } // end namespace mkvparser
inline long mkvparser::Segment::LoadCluster() inline long mkvparser::Segment::LoadCluster() {
{
long long pos; long long pos;
long size; long size;

View File

@@ -10,17 +10,11 @@
#include <cassert> #include <cassert>
namespace mkvparser namespace mkvparser {
{
MkvReader::MkvReader() : MkvReader::MkvReader() : m_file(NULL), reader_owns_file_(true) {}
m_file(NULL),
reader_owns_file_(true) {
}
MkvReader::MkvReader(FILE* fp) : MkvReader::MkvReader(FILE* fp) : m_file(fp), reader_owns_file_(false) {
m_file(fp),
reader_owns_file_(false) {
GetFileSize(); GetFileSize();
} }
@@ -30,8 +24,7 @@ MkvReader::~MkvReader() {
m_file = NULL; m_file = NULL;
} }
int MkvReader::Open(const char* fileName) int MkvReader::Open(const char* fileName) {
{
if (fileName == NULL) if (fileName == NULL)
return -1; return -1;
@@ -83,17 +76,14 @@ bool MkvReader::GetFileSize() {
return true; return true;
} }
void MkvReader::Close() void MkvReader::Close() {
{ if (m_file != NULL) {
if (m_file != NULL)
{
fclose(m_file); fclose(m_file);
m_file = NULL; m_file = NULL;
} }
} }
int MkvReader::Length(long long* total, long long* available) int MkvReader::Length(long long* total, long long* available) {
{
if (m_file == NULL) if (m_file == NULL)
return -1; return -1;
@@ -106,8 +96,7 @@ int MkvReader::Length(long long* total, long long* available)
return 0; return 0;
} }
int MkvReader::Read(long long offset, long len, unsigned char* buffer) int MkvReader::Read(long long offset, long len, unsigned char* buffer) {
{
if (m_file == NULL) if (m_file == NULL)
return -1; return -1;

View File

@@ -12,16 +12,12 @@
#include "mkvparser.hpp" #include "mkvparser.hpp"
#include <cstdio> #include <cstdio>
namespace mkvparser namespace mkvparser {
{
class MkvReader : public IMkvReader class MkvReader : public IMkvReader {
{
MkvReader(const MkvReader&);
MkvReader& operator=(const MkvReader&);
public: public:
MkvReader(); MkvReader();
MkvReader(FILE* fp); explicit MkvReader(FILE* fp);
virtual ~MkvReader(); virtual ~MkvReader();
int Open(const char*); int Open(const char*);
@@ -29,7 +25,10 @@ public:
virtual int Read(long long position, long length, unsigned char* buffer); virtual int Read(long long position, long length, unsigned char* buffer);
virtual int Length(long long* total, long long* available); virtual int Length(long long* total, long long* available);
private: private:
MkvReader(const MkvReader&);
MkvReader& operator=(const MkvReader&);
// Determines the size of the file. This is called either by the constructor // Determines the size of the file. This is called either by the constructor
// or by the Open function depending on file ownership. Returns true on // or by the Open function depending on file ownership. Returns true on

View File

@@ -16,15 +16,11 @@
namespace mkvmuxer { namespace mkvmuxer {
MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) { MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {}
}
MkvWriter::MkvWriter(FILE* fp): file_(fp), writer_owns_file_(false) { MkvWriter::MkvWriter(FILE* fp) : file_(fp), writer_owns_file_(false) {}
}
MkvWriter::~MkvWriter() { MkvWriter::~MkvWriter() { Close(); }
Close();
}
int32 MkvWriter::Write(const void* buffer, uint32 length) { int32 MkvWriter::Write(const void* buffer, uint32 length) {
if (!file_) if (!file_)
@@ -87,11 +83,8 @@ int32 MkvWriter::Position(int64 position) {
#endif #endif
} }
bool MkvWriter::Seekable() const { bool MkvWriter::Seekable() const { return true; }
return true;
}
void MkvWriter::ElementStartNotify(uint64, int64) { void MkvWriter::ElementStartNotify(uint64, int64) {}
}
} // namespace mkvmuxer } // namespace mkvmuxer

View File

@@ -20,7 +20,7 @@ namespace mkvmuxer {
class MkvWriter : public IMkvWriter { class MkvWriter : public IMkvWriter {
public: public:
MkvWriter(); MkvWriter();
MkvWriter(FILE* fp); explicit MkvWriter(FILE* fp);
virtual ~MkvWriter(); virtual ~MkvWriter();
// IMkvWriter interface // IMkvWriter interface