Skip to content

Commit

Permalink
Fix EXT-X-MEDIA parsing.
Browse files Browse the repository at this point in the history
I really don't remember when it was broken or
it feature just made unfinished :\ Anyway it
passed tests now and seems worked ok.
  • Loading branch information
Alexander I.Grafov committed Apr 30, 2016
1 parent fb07fd8 commit 304751b
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 19 deletions.
18 changes: 8 additions & 10 deletions reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,6 @@ func decodeParamsLine(line string) map[string]string {

// Parse one line of master playlist.
func decodeLineOfMasterPlaylist(p *MasterPlaylist, state *decodingState, line string, strict bool) error {
var alt *Alternative
var alternatives []*Alternative
var err error

line = strings.TrimSpace(line)
Expand All @@ -228,9 +226,8 @@ func decodeLineOfMasterPlaylist(p *MasterPlaylist, state *decodingState, line st
return err
}
case strings.HasPrefix(line, "#EXT-X-MEDIA:"):
var alt Alternative
state.listType = MASTER
alt = new(Alternative)
alternatives = append(alternatives, alt)
for k, v := range decodeParamsLine(line[13:]) {
switch k {
case "TYPE":
Expand Down Expand Up @@ -261,13 +258,14 @@ func decodeLineOfMasterPlaylist(p *MasterPlaylist, state *decodingState, line st
alt.URI = v
}
}
state.alternatives = append(state.alternatives, &alt)
case !state.tagStreamInf && strings.HasPrefix(line, "#EXT-X-STREAM-INF:"):
state.tagStreamInf = true
state.listType = MASTER
state.variant = new(Variant)
if len(alternatives) > 0 {
state.variant.Alternatives = alternatives
alternatives = nil
if len(state.alternatives) > 0 {
state.variant.Alternatives = state.alternatives
state.alternatives = nil
}
p.Variants = append(p.Variants, state.variant)
for k, v := range decodeParamsLine(line[18:]) {
Expand Down Expand Up @@ -310,9 +308,9 @@ func decodeLineOfMasterPlaylist(p *MasterPlaylist, state *decodingState, line st
state.listType = MASTER
state.variant = new(Variant)
state.variant.Iframe = true
if len(alternatives) > 0 {
state.variant.Alternatives = alternatives
alternatives = nil
if len(state.alternatives) > 0 {
state.variant.Alternatives = state.alternatives
state.alternatives = nil
}
p.Variants = append(p.Variants, state.variant)
for k, v := range decodeParamsLine(line[26:]) {
Expand Down
22 changes: 18 additions & 4 deletions reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,25 @@ func TestDecodeMasterPlaylistWithAlternatives(t *testing.T) {
if p.ver != 3 {
t.Errorf("Version of parsed playlist = %d (must = 3)", p.ver)
}
// if len(p.Variants) != 5 {
// t.Fatal("Not all variants in master playlist parsed.")
// }
if len(p.Variants) != 4 {
t.Fatal("not all variants in master playlist parsed")
}
// TODO check other values
//fmt.Println(p.Encode().String())
for i, v := range p.Variants {
if i == 0 && len(v.Alternatives) != 3 {
t.Fatalf("not all alternatives from #EXT-X-MEDIA parsed (has %d but should be 3", len(v.Alternatives))
}
if i == 1 && len(v.Alternatives) != 3 {
t.Fatalf("not all alternatives from #EXT-X-MEDIA parsed (has %d but should be 3", len(v.Alternatives))
}
if i == 2 && len(v.Alternatives) != 3 {
t.Fatalf("not all alternatives from #EXT-X-MEDIA parsed (has %d but should be 3", len(v.Alternatives))
}
if i == 3 && len(v.Alternatives) > 0 {
t.Fatal("should not be alternatives for this variant")
}
}
// fmt.Println(p.Encode().String())
}

// Decode a master playlist with Name tag in EXT-X-STREAM-INF
Expand Down
11 changes: 6 additions & 5 deletions structure.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,11 +154,11 @@ type VariantParams struct {
Resolution string
Audio string // EXT-X-STREAM-INF only
Video string
Subtitles string // EXT-X-STREAM-INF only
Captions string // EXT-X-STREAM-INF only
Name string // EXT-X-STREAM-INF only (non standard Wowza/JWPlayer extension to name the variant/quality in UA)
Iframe bool // EXT-X-I-FRAME-STREAM-INF
Alternatives []*Alternative
Subtitles string // EXT-X-STREAM-INF only
Captions string // EXT-X-STREAM-INF only
Name string // EXT-X-STREAM-INF only (non standard Wowza/JWPlayer extension to name the variant/quality in UA)
Iframe bool // EXT-X-I-FRAME-STREAM-INF
Alternatives []*Alternative // EXT-X-MEDIA
}

// This structure represents EXT-X-MEDIA tag in variants.
Expand Down Expand Up @@ -270,6 +270,7 @@ type decodingState struct {
offset int64
duration float64
variant *Variant
alternatives []*Alternative
xkey *Key
xmap *Map
scte *SCTE
Expand Down

0 comments on commit 304751b

Please sign in to comment.