1 Star 0 Fork 1

general252 / ebml-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
seekhead.go 3.68 KB
一键复制 编辑 原始数据 按行查看 历史
LIN 提交于 2023-08-24 13:30 . rename
// Copyright 2019 The ebml-go authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mkvcore
import (
"bytes"
"gitee.com/general252/ebml-go"
)
func setSeekHead(header *flexHeader, opts ...ebml.MarshalOption) error {
infoPos := new(uint64)
tracksPos := new(uint64)
header.Segment.SeekHead = &seekHeadFixed{}
if header.Segment.Info != nil {
header.Segment.SeekHead.Seek = append(header.Segment.SeekHead.Seek, seekFixed{
SeekID: ebml.ElementInfo.Bytes(),
SeekPosition: infoPos,
})
}
header.Segment.SeekHead.Seek = append(header.Segment.SeekHead.Seek, seekFixed{
SeekID: ebml.ElementTracks.Bytes(),
SeekPosition: tracksPos,
})
var segmentPos uint64
hook := func(e *ebml.Element) {
switch e.Name {
case "SeekHead":
// SeekHead position is the top of the Segment contents.
// Origin of the segment position is here.
segmentPos = e.Position
case "Info":
*infoPos = e.Position - segmentPos
case "Tracks":
*tracksPos = e.Position - segmentPos
}
}
optsWithHook := append([]ebml.MarshalOption{}, opts...)
optsWithHook = append(optsWithHook, ebml.WithElementWriteHooks(hook))
var buf bytes.Buffer
if err := ebml.Marshal(header, &buf, optsWithHook...); err != nil {
return err
}
return nil
}
func setSeekHead2(header *myFlexHeaderSegment, clusterPos, cuesPos *uint64, options *BlockWriterOptions) error {
var (
infoPos = new(uint64)
tracksPos = new(uint64)
tagsPos = new(uint64)
)
if cuesPos == nil {
clusterPos = new(uint64)
}
if cuesPos == nil {
cuesPos = new(uint64)
}
header.Segment.SeekHead = &seekHeadFixed{}
if header.Segment.Info != nil {
header.Segment.SeekHead.Seek = append(header.Segment.SeekHead.Seek, seekFixed{
SeekID: ebml.ElementInfo.Bytes(),
SeekPosition: infoPos,
})
}
header.Segment.SeekHead.Seek = append(header.Segment.SeekHead.Seek, seekFixed{
SeekID: ebml.ElementTracks.Bytes(),
SeekPosition: tracksPos,
})
if len(header.Segment.Tags) > 0 {
header.Segment.SeekHead.Seek = append(header.Segment.SeekHead.Seek, seekFixed{
SeekID: ebml.ElementTags.Bytes(),
SeekPosition: tagsPos,
})
}
header.Segment.SeekHead.Seek = append(header.Segment.SeekHead.Seek, seekFixed{
SeekID: ebml.ElementCluster.Bytes(),
SeekPosition: clusterPos,
})
if options.cues {
header.Segment.SeekHead.Seek = append(header.Segment.SeekHead.Seek, seekFixed{
SeekID: ebml.ElementCues.Bytes(),
SeekPosition: cuesPos,
})
}
var segmentPos uint64
hook := func(e *ebml.Element) {
switch e.Name {
case "SeekHead":
// SeekHead position is the top of the Segment contents.
// Origin of the segment position is here.
segmentPos = e.Position
case "Info":
*infoPos = e.Position - segmentPos
case "Tracks":
*tracksPos = e.Position - segmentPos
case "Tags":
*tagsPos = e.Position - segmentPos
case "Cluster":
*clusterPos = e.Position - segmentPos
case "Cues":
*cuesPos = e.Position - segmentPos
}
}
optsWithHook := append([]ebml.MarshalOption{}, options.marshalOpts...)
optsWithHook = append(optsWithHook, ebml.WithElementWriteHooks(hook))
var buf bytes.Buffer
if err := ebml.Marshal(header, &buf, optsWithHook...); err != nil {
return err
}
return nil
}
Go
1
https://gitee.com/general252/ebml-go.git
git@gitee.com:general252/ebml-go.git
general252
ebml-go
ebml-go
v0.20.18

搜索帮助