diff --git a/mpd/events.go b/mpd/events.go new file mode 100644 index 0000000..ef7b981 --- /dev/null +++ b/mpd/events.go @@ -0,0 +1,18 @@ +package mpd + +import "encoding/xml" + +type EventStream struct { + XMLName xml.Name `xml:"EventStream"` + SchemeIDURI *string `xml:"schemeIdUri,attr"` + Value *string `xml:"value,attr,omitempty"` + Timescale *int64 `xml:"timescale,attr"` + Events []Event `xml:"Event,omitempty"` +} + +type Event struct { + XMLName xml.Name `xml:"Event"` + ID *string `xml:"id,attr,omitempty"` + PresentationTime *int64 `xml:"presentationTime,attr,omitempty"` + Duration *int64 `xml:"duration,attr,omitempty"` +} diff --git a/mpd/events_test.go b/mpd/events_test.go new file mode 100644 index 0000000..1c75d30 --- /dev/null +++ b/mpd/events_test.go @@ -0,0 +1,66 @@ +package mpd + +import ( + "testing" + + "github.com/zencoder/go-dash/helpers/ptrs" + "github.com/zencoder/go-dash/helpers/require" + "github.com/zencoder/go-dash/helpers/testfixtures" +) + +const ( + VALID_EVENT_STREAM_SCHEME_ID_URI = "urn:example:eventstream" + VALID_EVENT_STREAM_VALUE = "eventstream" + VALID_EVENT_STREAM_TIMESCALE int64 = 10 +) + +func newEventStreamMPD() *MPD { + m := NewDynamicMPD( + DASH_PROFILE_LIVE, + VALID_AVAILABILITY_START_TIME, + VALID_MIN_BUFFER_TIME, + ) + p := m.GetCurrentPeriod() + + es := EventStream{ + SchemeIDURI: ptrs.Strptr(VALID_EVENT_STREAM_SCHEME_ID_URI), + Value: ptrs.Strptr(VALID_EVENT_STREAM_VALUE), + Timescale: ptrs.Int64ptr(VALID_EVENT_STREAM_TIMESCALE), + } + + e0 := Event{ + ID: ptrs.Strptr("event-0"), + PresentationTime: ptrs.Int64ptr(100), + Duration: ptrs.Int64ptr(50), + } + + e1 := Event{ + ID: ptrs.Strptr("event-1"), + PresentationTime: ptrs.Int64ptr(200), + Duration: ptrs.Int64ptr(50), + } + + es.Events = append(es.Events, e0, e1) + p.EventStreams = append(p.EventStreams, es) + + return m +} + +func TestEventStreamsWriteToString(t *testing.T) { + m := newEventStreamMPD() + + got, err := m.WriteToString() + require.NoError(t, err) + + testfixtures.CompareFixture(t, "fixtures/events.mpd", got) +} + +func TestReadEventStreams(t *testing.T) { + m, err := ReadFromFile("fixtures/events.mpd") + require.NoError(t, err) + + got, err := m.WriteToString() + require.NoError(t, err) + + testfixtures.CompareFixture(t, "fixtures/events.mpd", got) +} diff --git a/mpd/fixtures/events.mpd b/mpd/fixtures/events.mpd new file mode 100644 index 0000000..b54d314 --- /dev/null +++ b/mpd/fixtures/events.mpd @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mpd/mpd.go b/mpd/mpd.go index 3847f5f..d114aea 100644 --- a/mpd/mpd.go +++ b/mpd/mpd.go @@ -92,6 +92,7 @@ type Period struct { SegmentList *SegmentList `xml:"SegmentList,omitempty"` SegmentTemplate *SegmentTemplate `xml:"SegmentTemplate,omitempty"` AdaptationSets []*AdaptationSet `xml:"AdaptationSet,omitempty"` + EventStreams []EventStream `xml:"EventStream,omitempty"` } type DescriptorType struct {