Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
build
out
.gradle
.idea
7 changes: 6 additions & 1 deletion src/main/java/io/lindstrom/m3u8/model/Variant.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ public interface Variant {
*/
Optional<String> pathwayId();

/**
* @return variant attribute REQ-VIDEO-LAYOUT
*/
Optional<List<String>> reqVideoLayout();

static Builder builder() {
return new Builder();
}
Expand All @@ -122,4 +127,4 @@ public Builder videoRange(String value) {
return videoRange(VideoRange.valueOf(value));
}
}
}
}
16 changes: 15 additions & 1 deletion src/main/java/io/lindstrom/m3u8/parser/VariantAttribute.java
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,20 @@ public void read(Variant.Builder builder, String value) throws PlaylistParserExc
public void write(Variant value, TextBuilder textBuilder) {
value.pathwayId().ifPresent(v -> textBuilder.addQuoted(key(), v));
}
},

REQ_VIDEO_LAYOUT {
@Override
public void read(Variant.Builder builder, String value) {
builder.reqVideoLayout(ParserUtils.split(value, ","));
}

@Override
public void write(Variant value, TextBuilder textBuilder) {
if (value.reqVideoLayout().isPresent()) {
textBuilder.addQuoted(key(), String.join(",", value.reqVideoLayout().get()));
}
}
};

final static Map<String, VariantAttribute> attributeMap = ParserUtils.toMap(values(), Attribute::key);
Expand All @@ -223,4 +237,4 @@ static Variant parse(String attributes, String uri, ParsingMode parsingMode) thr
builder.uri(uri);
return builder.build();
}
}
}
3 changes: 2 additions & 1 deletion src/test/java/io/lindstrom/m3u8/model/IFrameVariantTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ public class IFrameVariantTest {
public void allMethodsFromVariantExists() {
// All attributes defined for the EXT-X-STREAM-INF tag (Section 4.4.6.2)
// are also defined for the EXT-X-I-FRAME-STREAM-INF tag, except for the
// FRAME-RATE, AUDIO, SUBTITLES, and CLOSED-CAPTIONS attributes.
// FRAME-RATE, AUDIO, SUBTITLES, CLOSED-CAPTIONS and REQ-VIDEO-LAYOUTattributes.
List<String> ignoreMethods = new ArrayList<>();
ignoreMethods.add("frameRate");
ignoreMethods.add("audio");
ignoreMethods.add("subtitles");
ignoreMethods.add("frameRate");
ignoreMethods.add("closedCaptions");
ignoreMethods.add("closedCaptionsNone");
ignoreMethods.add("reqVideoLayout");

for (Method m : Variant.class.getMethods()) {
if (ignoreMethods.contains(m.getName())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public static List<Path> data() {
"open-m3u8/multivariantPlaylistWithAlternativeAudio.m3u8",
"open-m3u8/multivariantPlaylistWithAlternativeVideo.m3u8",
"open-m3u8/multivariantPlaylistWithIFrames.m3u8",
"spatial/with-1-variant.m3u8",
"spatial/with-5-variant.m3u8",
"multivariant/content-steering.m3u8")
.map(p -> Paths.get("src/test/resources/", p))
.collect(Collectors.toList());
Expand Down
13 changes: 13 additions & 0 deletions src/test/resources/spatial/with-1-variant.m3u8
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#EXTM3U
#EXT-X-VERSION:12
#EXT-X-MEDIA:TYPE=SUBTITLES,URI="en-US/en-US.m3u8",GROUP-ID="subs",LANGUAGE="en-US",NAME="English",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO
#EXT-X-STREAM-INF:BANDWIDTH=263248,AVERAGE-BANDWIDTH=271179,CODECS="hvc1.2.20000000.L123.B0",RESOLUTION=1920x1080,FRAME-RATE=60.0,SUBTITLES="subs",CLOSED-CAPTIONS=NONE,VIDEO-RANGE=SDR,REQ-VIDEO-LAYOUT="CH-STEREO"
1080p/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=146501,AVERAGE-BANDWIDTH=154432,CODECS="hvc1.2.20000000.L123.B0",RESOLUTION=1280x720,FRAME-RATE=60.0,SUBTITLES="subs",CLOSED-CAPTIONS=NONE,VIDEO-RANGE=SDR,REQ-VIDEO-LAYOUT="CH-STEREO"
720p/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=109068,AVERAGE-BANDWIDTH=117006,CODECS="hvc1.2.20000000.L123.B0",RESOLUTION=960x540,FRAME-RATE=60.0,SUBTITLES="subs",CLOSED-CAPTIONS=NONE,VIDEO-RANGE=SDR,REQ-VIDEO-LAYOUT="CH-STEREO"
540p/540p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=83879,AVERAGE-BANDWIDTH=91809,CODECS="hvc1.2.20000000.L123.B0",RESOLUTION=640x360,FRAME-RATE=60.0,SUBTITLES="subs",CLOSED-CAPTIONS=NONE,VIDEO-RANGE=SDR,REQ-VIDEO-LAYOUT="CH-STEREO"
360p/360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=72223,AVERAGE-BANDWIDTH=80153,CODECS="hvc1.2.20000000.L123.B0",RESOLUTION=480x270,FRAME-RATE=60.0,SUBTITLES="subs",CLOSED-CAPTIONS=NONE,VIDEO-RANGE=SDR,REQ-VIDEO-LAYOUT="CH-STEREO"
270p/270p.m3u8
5 changes: 5 additions & 0 deletions src/test/resources/spatial/with-5-variant.m3u8
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#EXTM3U
#EXT-X-VERSION:12
#EXT-X-MEDIA:TYPE=SUBTITLES,URI="subs_en-US/en-US.m3u8",GROUP-ID="subs",LANGUAGE="en-US",NAME="English",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO
#EXT-X-STREAM-INF:BANDWIDTH=263248,AVERAGE-BANDWIDTH=271179,CODECS="hvc1.2.20000000.L123.B0",RESOLUTION=1920x1080,FRAME-RATE=60.0,SUBTITLES="subs",CLOSED-CAPTIONS=NONE,VIDEO-RANGE=SDR,REQ-VIDEO-LAYOUT="CH-STEREO"
1080p/1080p.m3u8