113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
// 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 ebml_test
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.gammaspectra.live/WeebDataHoarder/ebml-go"
|
|
"git.gammaspectra.live/WeebDataHoarder/ebml-go/webm"
|
|
)
|
|
|
|
func TestMarshal_RoundtripWebM(t *testing.T) {
|
|
webm0 := struct {
|
|
Header webm.EBMLHeader `ebml:"EBML"`
|
|
Segment webm.Segment `ebml:"Segment,size=unknown"`
|
|
}{
|
|
Header: webm.EBMLHeader{
|
|
EBMLVersion: 1,
|
|
EBMLReadVersion: 1,
|
|
EBMLMaxIDLength: 4,
|
|
EBMLMaxSizeLength: 8,
|
|
DocType: "webm",
|
|
DocTypeVersion: 2,
|
|
DocTypeReadVersion: 2,
|
|
},
|
|
Segment: webm.Segment{
|
|
Info: webm.Info{
|
|
TimecodeScale: 1000000, // 1ms
|
|
MuxingApp: "ebml-go example",
|
|
WritingApp: "ebml-go example",
|
|
DateUTC: time.Now().Truncate(time.Millisecond),
|
|
},
|
|
Tracks: webm.Tracks{
|
|
TrackEntry: []webm.TrackEntry{
|
|
{
|
|
Name: "Video",
|
|
TrackNumber: 1,
|
|
TrackUID: 12345,
|
|
CodecID: "V_VP8",
|
|
TrackType: 1,
|
|
DefaultDuration: 33333333,
|
|
Video: &webm.Video{
|
|
PixelWidth: 320,
|
|
PixelHeight: 240,
|
|
},
|
|
CodecPrivate: []byte{0x01, 0x02},
|
|
},
|
|
{
|
|
Name: "Audio",
|
|
TrackNumber: 2,
|
|
TrackUID: 54321,
|
|
CodecID: "A_OPUS",
|
|
TrackType: 2,
|
|
DefaultDuration: 33333333,
|
|
Audio: &webm.Audio{
|
|
SamplingFrequency: 48000.0,
|
|
Channels: 2,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Cluster: []webm.Cluster{
|
|
{
|
|
Timecode: 0,
|
|
},
|
|
{
|
|
Timecode: 1234567,
|
|
},
|
|
},
|
|
Cues: &webm.Cues{
|
|
CuePoint: []webm.CuePoint{
|
|
{
|
|
CueTime: 1,
|
|
CueTrackPositions: []webm.CueTrackPosition{
|
|
{CueTrack: 2, CueClusterPosition: 3, CueBlockNumber: 4},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
var b bytes.Buffer
|
|
if err := ebml.Marshal(&webm0, &b); err != nil {
|
|
t.Fatalf("Failed to Marshal: '%v'", err)
|
|
}
|
|
var webm1 struct {
|
|
Header webm.EBMLHeader `ebml:"EBML"`
|
|
Segment webm.Segment `ebml:"Segment,size=unknown"`
|
|
}
|
|
if err := ebml.Unmarshal(bytes.NewBuffer(b.Bytes()), &webm1); err != nil {
|
|
t.Fatalf("Failed to Unmarshal: '%v'", err)
|
|
}
|
|
|
|
if !reflect.DeepEqual(webm0, webm1) {
|
|
t.Errorf("Roundtrip result doesn't match original\nexpected: %+v\n got: %+v", webm0, webm1)
|
|
}
|
|
}
|