Skip to content

Commit

Permalink
Add ElementOffset field
Browse files Browse the repository at this point in the history
  • Loading branch information
remko committed Jun 12, 2023
1 parent f0fb81b commit 94fa39a
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 60 deletions.
20 changes: 11 additions & 9 deletions mkvparse.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@ const (
// ElementInfo contains information about an element encountered in
// the stream, and is passed to the handler by the parser on parse events.
type ElementInfo struct {
Offset int64
Size int64
Level int
ElementOffset int64
Offset int64 // Data offset
Size int64
Level int
}

// Handler declares an interface for handling parse events
Expand Down Expand Up @@ -147,14 +148,14 @@ func parseElement(reader io.Reader, currentOffset int64, level int, unknownSizeP
if unknownSizeParent != -1 && isFinishUnknownSizeBlock(id, unknownSizeParent) {
return 0, id, idCount, nil
}
count, err = parseElementAfterID(reader, id, currentOffset+idCount, level, unknownSizeParent, handler)
count, err = parseElementAfterID(reader, id, currentOffset, currentOffset+idCount, level, unknownSizeParent, handler)
if err != nil {
return -1, -1, -1, err
}
return count + idCount, -1, -1, nil
}

func parseElementAfterID(reader io.Reader, id ElementID, currentOffset int64, level int, unknownSizeParent ElementID, handler Handler) (count int64, err error) {
func parseElementAfterID(reader io.Reader, id ElementID, elementOffset int64, currentOffset int64, level int, unknownSizeParent ElementID, handler Handler) (count int64, err error) {
size, sizeCount, all1, err := readVarInt(reader)
if err != nil {
return -1, err
Expand All @@ -164,9 +165,10 @@ func parseElementAfterID(reader io.Reader, id ElementID, currentOffset int64, le
dataOffset := currentOffset + sizeCount
count = sizeCount + size
info := ElementInfo{
Offset: dataOffset,
Size: size,
Level: level,
ElementOffset: elementOffset,
Offset: dataOffset,
Size: size,
Level: level,
}
if typ == masterType {
if all1 {
Expand Down Expand Up @@ -196,7 +198,7 @@ func parseElementAfterID(reader io.Reader, id ElementID, currentOffset int64, le
if nextID == -1 {
return count, nil
}
nextcount, err := parseElementAfterID(reader, nextID, dataOffset+count+nextIDCount, level, unknownSizeParent, handler)
nextcount, err := parseElementAfterID(reader, nextID, dataOffset+count, dataOffset+count+nextIDCount, level, unknownSizeParent, handler)
if err != nil {
return -1, err
}
Expand Down
119 changes: 68 additions & 51 deletions mkvparse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,27 +113,30 @@ func TestParseElement(t *testing.T) {
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: 3,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: 3,
Level: 0,
},
MasterBeginEvent{},
},
{
TimecodeElement,
ElementInfo{
Offset: 7,
Size: 1,
Level: 1,
ElementOffset: 5,
Offset: 7,
Size: 1,
Level: 1,
},
int64(0x3),
},
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: 3,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: 3,
Level: 0,
},
MasterEndEvent{},
},
Expand Down Expand Up @@ -168,72 +171,80 @@ func TestParseElement(t *testing.T) {
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: -1,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: -1,
Level: 0,
},
MasterBeginEvent{},
},
{
TimecodeElement,
ElementInfo{
Offset: 7,
Size: 1,
Level: 1,
ElementOffset: 5,
Offset: 7,
Size: 1,
Level: 1,
},
int64(0x3),
},
{
TimecodeElement,
ElementInfo{
Offset: 10,
Size: 1,
Level: 1,
ElementOffset: 8,
Offset: 10,
Size: 1,
Level: 1,
},
int64(0x3),
},
{
TimecodeElement,
ElementInfo{
Offset: 13,
Size: 1,
Level: 1,
ElementOffset: 11,
Offset: 13,
Size: 1,
Level: 1,
},
int64(0x3),
},
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: -1,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: -1,
Level: 0,
},
MasterEndEvent{},
},
{
ClusterElement,
ElementInfo{
Offset: 20,
Size: 3,
Level: 0,
ElementOffset: 15,
Offset: 20,
Size: 3,
Level: 0,
},
MasterBeginEvent{},
},
{
TimecodeElement,
ElementInfo{
Offset: 22,
Size: 1,
Level: 1,
ElementOffset: 20,
Offset: 22,
Size: 1,
Level: 1,
},
int64(0x3),
},
{
ClusterElement,
ElementInfo{
Offset: 20,
Size: 3,
Level: 0,
ElementOffset: 15,
Offset: 20,
Size: 3,
Level: 0,
},
MasterEndEvent{},
},
Expand Down Expand Up @@ -293,18 +304,20 @@ func TestParseMaster_Skips(t *testing.T) {
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: 3,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: 3,
Level: 0,
},
MasterBeginEvent{},
},
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: 3,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: 3,
Level: 0,
},
MasterEndEvent{},
},
Expand All @@ -325,36 +338,40 @@ func TestParseMaster_Skips(t *testing.T) {
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: -1,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: -1,
Level: 0,
},
MasterBeginEvent{},
},
{
ClusterElement,
ElementInfo{
Offset: 5,
Size: -1,
Level: 0,
ElementOffset: 0,
Offset: 5,
Size: -1,
Level: 0,
},
MasterEndEvent{},
},
{
ClusterElement,
ElementInfo{
Offset: 20,
Size: 3,
Level: 0,
ElementOffset: 15,
Offset: 20,
Size: 3,
Level: 0,
},
MasterBeginEvent{},
},
{
ClusterElement,
ElementInfo{
Offset: 20,
Size: 3,
Level: 0,
ElementOffset: 15,
Offset: 20,
Size: 3,
Level: 0,
},
MasterEndEvent{},
},
Expand Down

0 comments on commit 94fa39a

Please sign in to comment.