Skip to content

Commit b7eec0a

Browse files
jguerraBCJorge Guerra
jguerraBC
and
Jorge Guerra
authored
DELIVER-2153: Add caption labels to dash manifests (#95)
* Add Label Attribute to Dash structure * Add Labels on Dash manifest * Updated tests to meet new label criteria * Updated comments with a more accurate description of the subtitle functions Co-authored-by: Jorge Guerra <[email protected]>
1 parent 912863f commit b7eec0a

10 files changed

+32
-24
lines changed

examples/live.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func main() {
2626
_, _ = videoAS.AddNewRepresentationVideo(2295158, "avc1.4d401f", "1200", "30000/1001", 1024, 576)
2727
_, _ = videoAS.AddNewRepresentationVideo(2780732, "avc1.4d401f", "1500", "30000/1001", 1280, 720)
2828

29-
subtitleAS, _ := m.AddNewAdaptationSetSubtitle(mpd.DASH_MIME_TYPE_SUBTITLE_VTT, "en")
29+
subtitleAS, _ := m.AddNewAdaptationSetSubtitle(mpd.DASH_MIME_TYPE_SUBTITLE_VTT, "en", "Subtitle (En)")
3030
subtitleRep, _ := subtitleAS.AddNewRepresentationSubtitle(256, "subtitle_en")
3131
_ = subtitleRep.SetNewBaseURL("http://example.com/content/sintel/subtitles/subtitles_en.vtt")
3232
schemeIDURI := "urn:mpeg:dash:utc:direct:2014"

examples/ondemand.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func exampleOndemand() {
3131
_ = videoRep2.SetNewBaseURL("1200k/output-video-1.mp4")
3232
_, _ = videoRep2.AddNewSegmentBase("686-813", "0-685")
3333

34-
subtitleAS, _ := m.AddNewAdaptationSetSubtitle(mpd.DASH_MIME_TYPE_SUBTITLE_VTT, "en")
34+
subtitleAS, _ := m.AddNewAdaptationSetSubtitle(mpd.DASH_MIME_TYPE_SUBTITLE_VTT, "en", "Subtitle (En)")
3535
subtitleRep, _ := subtitleAS.AddNewRepresentationSubtitle(256, "captions_en")
3636
_ = subtitleRep.SetNewBaseURL("http://example.com/content/sintel/subtitles/subtitles_en.vtt")
3737

mpd/fixtures/hbbtv_profile.mpd

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
<Representation bandwidth="2295158" codecs="avc1.4d401f" frameRate="30000/1001" height="576" id="1200" width="1024"></Representation>
3434
<Representation bandwidth="2780732" codecs="avc1.4d401f" frameRate="30000/1001" height="720" id="1500" width="1280"></Representation>
3535
</AdaptationSet>
36-
<AdaptationSet mimeType="text/vtt" id="7357" lang="en">
36+
<AdaptationSet mimeType="text/vtt" id="7357" lang="en" label="Subtitle (En)">
3737
<Representation bandwidth="256" id="subtitle_en">
3838
<BaseURL>http://example.com/content/sintel/subtitles/subtitles_en.vtt</BaseURL>
3939
</Representation>

mpd/fixtures/live_profile.mpd

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<Representation bandwidth="2295158" codecs="avc1.4d401f" frameRate="30000/1001" height="576" id="1200" width="1024"></Representation>
3232
<Representation bandwidth="2780732" codecs="avc1.4d401f" frameRate="30000/1001" height="720" id="1500" width="1280"></Representation>
3333
</AdaptationSet>
34-
<AdaptationSet mimeType="text/vtt" id="7357" lang="en">
34+
<AdaptationSet mimeType="text/vtt" id="7357" lang="en" label="Subtitle (En)">
3535
<Representation bandwidth="256" id="subtitle_en">
3636
<BaseURL>http://example.com/content/sintel/subtitles/subtitles_en.vtt</BaseURL>
3737
</Representation>

mpd/fixtures/live_profile_dynamic.mpd

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<Representation bandwidth="2295158" codecs="avc1.4d401f" frameRate="30000/1001" height="576" id="1200" width="1024"></Representation>
3232
<Representation bandwidth="2780732" codecs="avc1.4d401f" frameRate="30000/1001" height="720" id="1500" width="1280"></Representation>
3333
</AdaptationSet>
34-
<AdaptationSet mimeType="text/vtt" id="7357" lang="en">
34+
<AdaptationSet mimeType="text/vtt" id="7357" lang="en" label="Subtitle (En)">
3535
<Representation bandwidth="256" id="subtitle_en">
3636
<BaseURL>http://example.com/content/sintel/subtitles/subtitles_en.vtt</BaseURL>
3737
</Representation>

mpd/fixtures/live_profile_multi_base_url.mpd

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
<Representation bandwidth="2295158" codecs="avc1.4d401f" frameRate="30000/1001" height="576" id="1200" width="1024"></Representation>
3535
<Representation bandwidth="2780732" codecs="avc1.4d401f" frameRate="30000/1001" height="720" id="1500" width="1280"></Representation>
3636
</AdaptationSet>
37-
<AdaptationSet mimeType="text/vtt" id="7357" lang="en">
37+
<AdaptationSet mimeType="text/vtt" id="7357" lang="en" label="Subtitle (En)">
3838
<Representation bandwidth="256" id="subtitle_en">
3939
<BaseURL>http://example.com/content/sintel/subtitles/subtitles_en.vtt</BaseURL>
4040
</Representation>

mpd/fixtures/ondemand_profile.mpd

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
</SegmentBase>
4141
</Representation>
4242
</AdaptationSet>
43-
<AdaptationSet mimeType="text/vtt" id="7357" lang="en">
43+
<AdaptationSet mimeType="text/vtt" id="7357" lang="en" label="Subtitle (En)">
4444
<Representation bandwidth="256" id="subtitle_en">
4545
<BaseURL>http://example.com/content/sintel/subtitles/subtitles_en.vtt</BaseURL>
4646
</Representation>

mpd/mpd.go

+16-9
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ type AdaptationSet struct {
190190
SegmentTemplate *SegmentTemplate `xml:"SegmentTemplate,omitempty"` // Live Profile Only
191191
Representations []*Representation `xml:"Representation,omitempty"`
192192
AccessibilityElems []*Accessibility `xml:"Accessibility,omitempty"`
193+
Label *string `xml:"label,attr"`
193194
}
194195

195196
func (as *AdaptationSet) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -639,23 +640,27 @@ func (period *Period) AddNewAdaptationSetVideoWithID(id string, mimeType string,
639640
// Create a new Adaptation Set for Subtitle Assets.
640641
// mimeType - MIME Type (i.e. text/vtt).
641642
// lang - Language (i.e. en).
642-
func (m *MPD) AddNewAdaptationSetSubtitle(mimeType string, lang string) (*AdaptationSet, error) {
643-
return m.period.AddNewAdaptationSetSubtitle(mimeType, lang)
643+
// label - Label for the subtitle from Studio (i.e. American)
644+
func (m *MPD) AddNewAdaptationSetSubtitle(mimeType string, lang string, label string) (*AdaptationSet, error) {
645+
return m.period.AddNewAdaptationSetSubtitle(mimeType, lang, label)
644646
}
645647

646648
// Create a new Adaptation Set for Subtitle Assets.
647649
// mimeType - MIME Type (i.e. text/vtt).
648650
// lang - Language (i.e. en).
649-
func (m *MPD) AddNewAdaptationSetSubtitleWithID(id string, mimeType string, lang string) (*AdaptationSet, error) {
650-
return m.period.AddNewAdaptationSetSubtitleWithID(id, mimeType, lang)
651+
// label - Label for the subtitle from Studio (i.e. American)
652+
func (m *MPD) AddNewAdaptationSetSubtitleWithID(id string, mimeType string, lang string, label string) (*AdaptationSet, error) {
653+
return m.period.AddNewAdaptationSetSubtitleWithID(id, mimeType, lang, label)
651654
}
652655

653656
// Create a new Adaptation Set for Subtitle Assets.
654657
// mimeType - MIME Type (i.e. text/vtt).
655658
// lang - Language (i.e. en).
656-
func (period *Period) AddNewAdaptationSetSubtitle(mimeType string, lang string) (*AdaptationSet, error) {
659+
// label - Label for the subtitle from Studio (i.e. American)
660+
func (period *Period) AddNewAdaptationSetSubtitle(mimeType string, lang string, label string) (*AdaptationSet, error) {
657661
as := &AdaptationSet{
658-
Lang: Strptr(lang),
662+
Lang: Strptr(lang),
663+
Label: Strptr(label),
659664
CommonAttributesAndElements: CommonAttributesAndElements{
660665
MimeType: Strptr(mimeType),
661666
},
@@ -670,10 +675,12 @@ func (period *Period) AddNewAdaptationSetSubtitle(mimeType string, lang string)
670675
// Create a new Adaptation Set for Subtitle Assets.
671676
// mimeType - MIME Type (i.e. text/vtt).
672677
// lang - Language (i.e. en).
673-
func (period *Period) AddNewAdaptationSetSubtitleWithID(id string, mimeType string, lang string) (*AdaptationSet, error) {
678+
// label - Label for the subtitle from Studio (i.e. American)
679+
func (period *Period) AddNewAdaptationSetSubtitleWithID(id string, mimeType string, lang string, label string) (*AdaptationSet, error) {
674680
as := &AdaptationSet{
675-
ID: Strptr(id),
676-
Lang: Strptr(lang),
681+
ID: Strptr(id),
682+
Lang: Strptr(lang),
683+
Label: Strptr(label),
677684
CommonAttributesAndElements: CommonAttributesAndElements{
678685
MimeType: Strptr(mimeType),
679686
},

mpd/mpd_read_write_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,14 @@ func TestAddNewAdaptationSetVideoWriteToString(t *testing.T) {
166166
func TestAddNewAdaptationSetSubtitleWriteToString(t *testing.T) {
167167
m := NewMPD(DASH_PROFILE_LIVE, VALID_MEDIA_PRESENTATION_DURATION, VALID_MIN_BUFFER_TIME)
168168

169-
_, _ = m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG)
169+
_, _ = m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG, VALID_SUBTITLE_LABEL)
170170

171171
xmlStr, err := m.WriteToString()
172172
require.NoError(t, err)
173173
expectedXML := `<?xml version="1.0" encoding="UTF-8"?>
174174
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediaPresentationDuration="PT6M16S" minBufferTime="PT1.97S">
175175
<Period>
176-
<AdaptationSet mimeType="text/vtt" id="7357" lang="en"></AdaptationSet>
176+
<AdaptationSet mimeType="text/vtt" id="7357" lang="en" label="Subtitle (En)"></AdaptationSet>
177177
</Period>
178178
</MPD>
179179
`
@@ -266,7 +266,7 @@ func LiveProfile() *MPD {
266266
_, _ = videoAS.AddNewRepresentationVideo(2295158, "avc1.4d401f", "1200", "30000/1001", 1024, 576)
267267
_, _ = videoAS.AddNewRepresentationVideo(2780732, "avc1.4d401f", "1500", "30000/1001", 1280, 720)
268268

269-
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG)
269+
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG, VALID_SUBTITLE_LABEL)
270270
subtitleRep, _ := subtitleAS.AddNewRepresentationSubtitle(VALID_SUBTITLE_BANDWIDTH, VALID_SUBTITLE_ID)
271271
_ = subtitleRep.SetNewBaseURL(VALID_SUBTITLE_URL)
272272

@@ -334,7 +334,7 @@ func LiveProfileDynamic() *MPD {
334334
_, _ = videoAS.AddNewRepresentationVideo(2295158, "avc1.4d401f", "1200", "30000/1001", 1024, 576)
335335
_, _ = videoAS.AddNewRepresentationVideo(2780732, "avc1.4d401f", "1500", "30000/1001", 1280, 720)
336336

337-
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG)
337+
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG, VALID_SUBTITLE_LABEL)
338338
subtitleRep, _ := subtitleAS.AddNewRepresentationSubtitle(VALID_SUBTITLE_BANDWIDTH, VALID_SUBTITLE_ID)
339339
_ = subtitleRep.SetNewBaseURL(VALID_SUBTITLE_URL)
340340

@@ -390,7 +390,7 @@ func HbbTVProfile() *MPD {
390390
_, _ = videoAS.AddNewRepresentationVideo(2295158, "avc1.4d401f", "1200", "30000/1001", 1024, 576)
391391
_, _ = videoAS.AddNewRepresentationVideo(2780732, "avc1.4d401f", "1500", "30000/1001", 1280, 720)
392392

393-
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG)
393+
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG, VALID_SUBTITLE_LABEL)
394394
subtitleRep, _ := subtitleAS.AddNewRepresentationSubtitle(VALID_SUBTITLE_BANDWIDTH, VALID_SUBTITLE_ID)
395395
_ = subtitleRep.SetNewBaseURL(VALID_SUBTITLE_URL)
396396

@@ -443,7 +443,7 @@ func OnDemandProfile() *MPD {
443443
_ = videoRep2.SetNewBaseURL("1200k/output-video-1.mp4")
444444
_, _ = videoRep2.AddNewSegmentBase("686-813", "0-685")
445445

446-
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG)
446+
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG, VALID_SUBTITLE_LABEL)
447447
subtitleRep, _ := subtitleAS.AddNewRepresentationSubtitle(VALID_SUBTITLE_BANDWIDTH, VALID_SUBTITLE_ID)
448448
_ = subtitleRep.SetNewBaseURL(VALID_SUBTITLE_URL)
449449

mpd/mpd_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const (
4343
VALID_WV_HEADER string = "CAESEFq91S9VSk8quNBh92FCUVUaCGNhc3RsYWJzIhhXcjNWTDFWS1R5cTQwR0gzWVVKUlZRPT0yB2RlZmF1bHQ="
4444
VALID_SUBTITLE_BANDWIDTH int64 = 256
4545
VALID_SUBTITLE_ID string = "subtitle_en"
46+
VALID_SUBTITLE_LABEL string = "Subtitle (En)"
4647
VALID_SUBTITLE_URL string = "http://example.com/content/sintel/subtitles/subtitles_en.vtt"
4748
VALID_ROLE string = "main"
4849
VALID_LOCATION string = "https://example.com/location.mpd"
@@ -356,7 +357,7 @@ func TestAddRepresentationVideo(t *testing.T) {
356357
func TestAddRepresentationSubtitle(t *testing.T) {
357358
m := NewMPD(DASH_PROFILE_LIVE, VALID_MEDIA_PRESENTATION_DURATION, VALID_MIN_BUFFER_TIME)
358359

359-
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG)
360+
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG, VALID_SUBTITLE_LABEL)
360361

361362
r, err := subtitleAS.AddNewRepresentationSubtitle(VALID_SUBTITLE_BANDWIDTH, VALID_SUBTITLE_ID)
362363

@@ -422,7 +423,7 @@ func TestAddNewBaseURLVideo(t *testing.T) {
422423

423424
func TestSetNewBaseURLSubtitle(t *testing.T) {
424425
m := NewMPD(DASH_PROFILE_ONDEMAND, VALID_MEDIA_PRESENTATION_DURATION, VALID_MIN_BUFFER_TIME)
425-
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG)
426+
subtitleAS, _ := m.AddNewAdaptationSetSubtitleWithID("7357", DASH_MIME_TYPE_SUBTITLE_VTT, VALID_LANG, VALID_SUBTITLE_LABEL)
426427

427428
r, _ := subtitleAS.AddNewRepresentationSubtitle(VALID_SUBTITLE_BANDWIDTH, VALID_SUBTITLE_ID)
428429

0 commit comments

Comments
 (0)