Skip to content

Commit 0c84c22

Browse files
committed
Merge branch 'develop_1.x' into candidate/1.6.0
2 parents 2867dbe + 9fbb538 commit 0c84c22

17 files changed

+1868
-199
lines changed

.github/workflows/build-and-test.yml

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
name: Build and test
2+
3+
on:
4+
pull_request:
5+
branches: [ "develop", "develop_1.x", "main", "main_1.x" ]
6+
7+
jobs:
8+
define-ios-device:
9+
name: Get iOS simulator device to run iOS tests on
10+
runs-on: macos-latest
11+
outputs:
12+
device: ${{ steps.ios.outputs.device }}
13+
steps:
14+
- id: ios
15+
run: echo "device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"`" >> "$GITHUB_OUTPUT"
16+
17+
build:
18+
name: Build and Test mamba and mambaTVOS
19+
runs-on: macos-latest
20+
needs: define-ios-device
21+
strategy:
22+
matrix:
23+
target:
24+
- scheme: mamba
25+
platform: iOS Simulator
26+
device: ${{ needs.define-ios-device.outputs.device }}
27+
- scheme: mambaTVOS
28+
platform: tvOS Simulator
29+
device: Apple TV
30+
steps:
31+
- name: Checkout
32+
uses: actions/checkout@v4
33+
- name: Build
34+
env:
35+
scheme: ${{ matrix.target.scheme }}
36+
platform: ${{ matrix.target.platform }}
37+
device: ${{ matrix.target.device }}
38+
run: |
39+
echo "scheme = $scheme"
40+
echo "platform = $platform"
41+
echo "device = $device"
42+
xcodebuild build-for-testing -scheme "$scheme" -"workspace" "mamba.xcworkspace" -destination "platform=$platform,name=$device"
43+
- name: Test
44+
env:
45+
scheme: ${{ matrix.target.scheme }}
46+
platform: ${{ matrix.target.platform }}
47+
device: ${{ matrix.target.device }}
48+
run: |
49+
echo "scheme = $scheme"
50+
echo "platform = $platform"
51+
echo "device = $device"
52+
xcodebuild test-without-building -scheme "$scheme" -"workspace" "mamba.xcworkspace" -destination "platform=$platform,name=$device"

mamba.xcodeproj/project.pbxproj

+41-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@
88

99
/* Begin PBXBuildFile section */
1010
01CD2E7A1DE4D46F002510E7 /* EXT_X_MAPTagParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CD2E791DE4D46F002510E7 /* EXT_X_MAPTagParserTests.swift */; };
11+
1447582D2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1447582C2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift */; };
12+
1447582E2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1447582C2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift */; };
13+
1447582F2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1447582C2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift */; };
14+
144758312C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758302C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift */; };
15+
144758322C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758302C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift */; };
16+
144758332C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758302C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift */; };
17+
144758352C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758342C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift */; };
18+
144758362C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758342C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift */; };
19+
144758372C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758342C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift */; };
20+
144758392C8620C000D12CCD /* HLSChannelsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758382C8620C000D12CCD /* HLSChannelsTests.swift */; };
21+
1447583A2C8620C000D12CCD /* HLSChannelsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758382C8620C000D12CCD /* HLSChannelsTests.swift */; };
22+
1447583B2C8620C000D12CCD /* HLSChannelsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144758382C8620C000D12CCD /* HLSChannelsTests.swift */; };
23+
1447583D2C8693E000D12CCD /* HLSVideoLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1447583C2C8693E000D12CCD /* HLSVideoLayoutTests.swift */; };
24+
1447583E2C8693E000D12CCD /* HLSVideoLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1447583C2C8693E000D12CCD /* HLSVideoLayoutTests.swift */; };
25+
1447583F2C8693E000D12CCD /* HLSVideoLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1447583C2C8693E000D12CCD /* HLSVideoLayoutTests.swift */; };
1126
1D28F3451EAA9E500010320B /* hls_ad_master_playlist.m3u8 in Resources */ = {isa = PBXBuildFile; fileRef = 1D28F3401EAA9E500010320B /* hls_ad_master_playlist.m3u8 */; };
1227
1D28F3461EAA9E500010320B /* hls_ad_variant_playlist.m3u8 in Resources */ = {isa = PBXBuildFile; fileRef = 1D28F3411EAA9E500010320B /* hls_ad_variant_playlist.m3u8 */; };
1328
1D28F3471EAA9E500010320B /* hls_master_playlist_sap.m3u8 in Resources */ = {isa = PBXBuildFile; fileRef = 1D28F3421EAA9E500010320B /* hls_master_playlist_sap.m3u8 */; };
@@ -617,6 +632,11 @@
617632

618633
/* Begin PBXFileReference section */
619634
01CD2E791DE4D46F002510E7 /* EXT_X_MAPTagParserTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EXT_X_MAPTagParserTests.swift; sourceTree = "<group>"; };
635+
1447582C2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EXT_X_SESSION_KEYValidator.swift; sourceTree = "<group>"; };
636+
144758302C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EXT_X_SESSION_DATATagValidator.swift; sourceTree = "<group>"; };
637+
144758342C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EXT_X_SESSION_DATAPlaylistValidator.swift; sourceTree = "<group>"; };
638+
144758382C8620C000D12CCD /* HLSChannelsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HLSChannelsTests.swift; sourceTree = "<group>"; };
639+
1447583C2C8693E000D12CCD /* HLSVideoLayoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HLSVideoLayoutTests.swift; sourceTree = "<group>"; };
620640
1D28F3401EAA9E500010320B /* hls_ad_master_playlist.m3u8 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = hls_ad_master_playlist.m3u8; sourceTree = "<group>"; };
621641
1D28F3411EAA9E500010320B /* hls_ad_variant_playlist.m3u8 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = hls_ad_variant_playlist.m3u8; sourceTree = "<group>"; };
622642
1D28F3421EAA9E500010320B /* hls_master_playlist_sap.m3u8 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = hls_master_playlist_sap.m3u8; sourceTree = "<group>"; };
@@ -903,7 +923,6 @@
903923
0173AB0D1D5BB371005DE51B /* Pantos-Generic Tag Validators */ = {
904924
isa = PBXGroup;
905925
children = (
906-
EC95478A1E5CC86300962535 /* EXTINFValidator.swift */,
907926
6DD0A1B0242FADC600FF7AAE /* EXT_X_DATERANGEPlaylistValidator.swift */,
908927
6DD0A1AC242F85C800FF7AAE /* EXT_X_DATERANGETagValidator.swift */,
909928
EC3B019E1DD4D47900B512E3 /* EXT_X_KEYValidator.swift */,
@@ -912,9 +931,13 @@
912931
EC3B01A11DD4D47900B512E3 /* EXT_X_MEDIARenditionGroupNAMEValidator.swift */,
913932
EC3B01A21DD4D47900B512E3 /* EXT_X_MEDIARenditionGroupTYPEValidator.swift */,
914933
43DE4EFC1E564DBE00EEE800 /* EXT_X_MEDIARenditionINSTREAMIDValidator.swift */,
934+
144758342C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift */,
935+
144758302C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift */,
936+
1447582C2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift */,
915937
43DE4EFA1E564DA300EEE800 /* EXT_X_STARTTimeOffsetValidator.swift */,
916938
EC3B01A31DD4D47900B512E3 /* EXT_X_STREAM_INFRenditionGroupValidator.swift */,
917939
EC3B01A41DD4D47900B512E3 /* EXT_X_TARGETDURATIONLengthValidator.swift */,
940+
EC95478A1E5CC86300962535 /* EXTINFValidator.swift */,
918941
EC7491F51DD29DD300AF4E20 /* GenericDictionaryTagValidator.swift */,
919942
EC7491F61DD29DD300AF4E20 /* GenericSingleTagValidator.swift */,
920943
EC7491F71DD29DD300AF4E20 /* HLSDictionaryTagValueIdentifier.swift */,
@@ -1313,10 +1336,12 @@
13131336
EC9BCAA21D749D8B0032BEBE /* Value Types */ = {
13141337
isa = PBXGroup;
13151338
children = (
1339+
144758382C8620C000D12CCD /* HLSChannelsTests.swift */,
13161340
EC7492AF1DD29F8900AF4E20 /* HLSCodecArrayTests.swift */,
13171341
EC7492B01DD29F8900AF4E20 /* HLSMediaTypeTests.swift */,
13181342
EC7492B11DD29F8900AF4E20 /* HLSPlaylistTypeTests.swift */,
13191343
EC7492B21DD29F8900AF4E20 /* HLSResolutionTests.swift */,
1344+
1447583C2C8693E000D12CCD /* HLSVideoLayoutTests.swift */,
13201345
);
13211346
path = "Value Types";
13221347
sourceTree = "<group>";
@@ -1767,6 +1792,7 @@
17671792
ECFAA6581E6DD93C00398D66 /* HLSPlaylist.swift in Sources */,
17681793
ECC410601EA02F4800B4E3C8 /* StructureState.swift in Sources */,
17691794
EC7491811DD29C3500AF4E20 /* String+Trim.swift in Sources */,
1795+
144758352C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift in Sources */,
17701796
EC7491C31DD29D5C00AF4E20 /* HLSValidationIssue.swift in Sources */,
17711797
EC74916E1DD29B5D00AF4E20 /* CollectionType+FindExtensions.swift in Sources */,
17721798
EC7491DA1DD29D9600AF4E20 /* GenericNoDataTagParser.swift in Sources */,
@@ -1836,7 +1862,9 @@
18361862
EC3B01AB1DD4D47900B512E3 /* EXT_X_MEDIARenditionGroupNAMEValidator.swift in Sources */,
18371863
EC7491651DD29B0F00AF4E20 /* FailableStringLiteralConvertible.swift in Sources */,
18381864
EC7491461DD299B400AF4E20 /* HLSPlaylistTypes.swift in Sources */,
1865+
144758312C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift in Sources */,
18391866
EC3B01A71DD4D47900B512E3 /* EXT_X_MEDIARenditionGroupAUTOSELECTValidator.swift in Sources */,
1867+
1447582D2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift in Sources */,
18401868
F700CD391E78A2BE001C9487 /* HLSStringRef_ConcreteNSString.m in Sources */,
18411869
43DE4EFB1E564DA300EEE800 /* EXT_X_STARTTimeOffsetValidator.swift in Sources */,
18421870
EC74918A1DD29CCB00AF4E20 /* StringDictionaryParser.swift in Sources */,
@@ -1914,11 +1942,13 @@
19141942
43DE4EFF1E564E1500EEE800 /* HLSMediaSpanTests.swift in Sources */,
19151943
ECE36DE41F2A9F10005E5DA7 /* HLSPlaylistTimelineAndSequencingTests.swift in Sources */,
19161944
01CD2E7A1DE4D46F002510E7 /* EXT_X_MAPTagParserTests.swift in Sources */,
1945+
144758392C8620C000D12CCD /* HLSChannelsTests.swift in Sources */,
19171946
EC7492481DD29E7300AF4E20 /* HLSValidatorTests.swift in Sources */,
19181947
EC7492AB1DD29F7000AF4E20 /* OrderedDictionaryTests.swift in Sources */,
19191948
EC74923E1DD29E7300AF4E20 /* HLSParser_Super8DemuxedTests.swift in Sources */,
19201949
EC7492781DD29EC800AF4E20 /* EXT_X_MEDIATagParserTests.swift in Sources */,
19211950
EC6F38921EA95882006BC30E /* HLSPlaylistInterfaceTests.swift in Sources */,
1951+
1447583D2C8693E000D12CCD /* HLSVideoLayoutTests.swift in Sources */,
19221952
);
19231953
runOnlyForDeploymentPostprocessing = 0;
19241954
};
@@ -1932,6 +1962,7 @@
19321962
ECFAA6591E6DD93C00398D66 /* HLSPlaylist.swift in Sources */,
19331963
ECC410611EA02F4800B4E3C8 /* StructureState.swift in Sources */,
19341964
EC3B01AA1DD4D47900B512E3 /* EXT_X_MEDIARenditionGroupDEFAULTValidator.swift in Sources */,
1965+
144758362C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift in Sources */,
19351966
EC3B01C41DD4D49A00B512E3 /* HLSPlaylistOneToManyValidator.swift in Sources */,
19361967
EC7491821DD29C3500AF4E20 /* String+Trim.swift in Sources */,
19371968
EC7491C41DD29D5C00AF4E20 /* HLSValidationIssue.swift in Sources */,
@@ -2001,7 +2032,9 @@
20012032
EC74917E1DD29C3500AF4E20 /* String+DateParsing.swift in Sources */,
20022033
EC3B01AC1DD4D47900B512E3 /* EXT_X_MEDIARenditionGroupNAMEValidator.swift in Sources */,
20032034
EC7491661DD29B0F00AF4E20 /* FailableStringLiteralConvertible.swift in Sources */,
2035+
144758322C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift in Sources */,
20042036
EC7491471DD299B400AF4E20 /* HLSPlaylistTypes.swift in Sources */,
2037+
1447582E2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift in Sources */,
20052038
F700CD3A1E78A2BE001C9487 /* HLSStringRef_ConcreteNSString.m in Sources */,
20062039
EC3B01A81DD4D47900B512E3 /* EXT_X_MEDIARenditionGroupAUTOSELECTValidator.swift in Sources */,
20072040
EC74918B1DD29CCB00AF4E20 /* StringDictionaryParser.swift in Sources */,
@@ -2079,11 +2112,13 @@
20792112
43DE4F001E564E1500EEE800 /* HLSMediaSpanTests.swift in Sources */,
20802113
EC7492B41DD29F8900AF4E20 /* HLSCodecArrayTests.swift in Sources */,
20812114
ECE36DE51F2A9F10005E5DA7 /* HLSPlaylistTimelineAndSequencingTests.swift in Sources */,
2115+
1447583A2C8620C000D12CCD /* HLSChannelsTests.swift in Sources */,
20822116
EC7492491DD29E7300AF4E20 /* HLSValidatorTests.swift in Sources */,
20832117
EC7492AC1DD29F7000AF4E20 /* OrderedDictionaryTests.swift in Sources */,
20842118
EC74923F1DD29E7300AF4E20 /* HLSParser_Super8DemuxedTests.swift in Sources */,
20852119
EC8A3C801F7C329900A50EED /* HLSPlaylistStructureMasterTests.swift in Sources */,
20862120
EC7492791DD29EC800AF4E20 /* EXT_X_MEDIATagParserTests.swift in Sources */,
2121+
1447583E2C8693E000D12CCD /* HLSVideoLayoutTests.swift in Sources */,
20872122
);
20882123
runOnlyForDeploymentPostprocessing = 0;
20892124
};
@@ -2097,6 +2132,7 @@
20972132
EC1CCD36209A2CF9006B59FF /* URL+hlsplaylist.swift in Sources */,
20982133
EC1CCD32209A2CF9006B59FF /* String+Trim.swift in Sources */,
20992134
EC1CCD46209A2CF9006B59FF /* GenericSingleTagValidator.swift in Sources */,
2135+
144758372C83D23100D12CCD /* EXT_X_SESSION_DATAPlaylistValidator.swift in Sources */,
21002136
EC1CCD59209A2CF9006B59FF /* HLSParser.swift in Sources */,
21012137
EC1CCD30209A2CF9006B59FF /* String+DateParsing.swift in Sources */,
21022138
EC1CCD53209A2CF9006B59FF /* GenericDictionaryTagWriter.swift in Sources */,
@@ -2166,7 +2202,9 @@
21662202
EC1CCD4F209A2CF9006B59FF /* HLSPlaylistTagCardinalityValidation.swift in Sources */,
21672203
EC1CCD2B209A2CF9006B59FF /* IndeterminateBool.swift in Sources */,
21682204
EC1CCCF9209A2CF9006B59FF /* HLSTagCriterion.swift in Sources */,
2205+
144758332C83C72B00D12CCD /* EXT_X_SESSION_DATATagValidator.swift in Sources */,
21692206
EC1CCD43209A2CF9006B59FF /* EXT_X_STREAM_INFRenditionGroupValidator.swift in Sources */,
2207+
1447582F2C83C20800D12CCD /* EXT_X_SESSION_KEYValidator.swift in Sources */,
21702208
EC1CCD35209A2CF9006B59FF /* StringDictionaryParser.swift in Sources */,
21712209
EC1CCD02209A2CF9006B59FF /* HLSStringRef_ConcreteNSString.m in Sources */,
21722210
EC1CCD38209A2CF9006B59FF /* GenericNoDataTagParser.swift in Sources */,
@@ -2244,11 +2282,13 @@
22442282
ECE253FD209A50B500D388CE /* ThirdPartyTagListSupportTests.swift in Sources */,
22452283
ECE25408209A50B500D388CE /* HLSResolutionTests.swift in Sources */,
22462284
ECE253F6209A50B500D388CE /* GenericSingleValueTagParserTests.swift in Sources */,
2285+
1447583B2C8620C000D12CCD /* HLSChannelsTests.swift in Sources */,
22472286
ECE253FA209A50B500D388CE /* GenericSingleTagValidatorTests.swift in Sources */,
22482287
ECE253DF209A509900D388CE /* HLSParserTest.swift in Sources */,
22492288
ECE253F1209A50B500D388CE /* EXT_X_KEYTagParserTests.swift in Sources */,
22502289
ECE25403209A50B500D388CE /* String+Helio.swift in Sources */,
22512290
ECE25400209A50B500D388CE /* IndeterminateBoolTests.swift in Sources */,
2291+
1447583F2C8693E000D12CCD /* HLSVideoLayoutTests.swift in Sources */,
22522292
);
22532293
runOnlyForDeploymentPostprocessing = 0;
22542294
};

mambaSharedFramework/HLS Models/Playlist Structure/HLSPlaylistStructure.swift

+36-8
Original file line numberDiff line numberDiff line change
@@ -372,16 +372,44 @@ fileprivate struct HLSPlaylistStructureConstructor {
372372
var currentSegmentDuration: CMTime = CMTime.invalid
373373
var discontinuity = false
374374
let tagDescriptor = self.tagDescriptor(forTags: tags)
375-
376-
// figure out our media sequence start (defaults to 1 if not specified)
377-
let mediaSequenceTags = tags.filter{ $0.tagDescriptor == PantosTag.EXT_X_MEDIA_SEQUENCE }
378-
if mediaSequenceTags.count > 0 {
379-
assert(mediaSequenceTags.count == 1, "Unexpected to have more than one media sequence")
380-
if let startMediaSequence: MediaSequence = mediaSequenceTags.first?.value(forValueIdentifier: PantosValue.sequence) {
381-
currentMediaSequence = startMediaSequence
375+
376+
// collect media sequence and skip tag (if they exist) as they impact the initial media sequence value
377+
var mediaSequenceTag: HLSTag?
378+
var skipTag: HLSTag?
379+
for tag in tags {
380+
switch tag.tagDescriptor {
381+
case PantosTag.EXT_X_MEDIA_SEQUENCE: mediaSequenceTag = tag
382+
case PantosTag.EXT_X_SKIP: skipTag = tag
383+
case PantosTag.Location:
384+
// Both the EXT-X-MEDIA-SEQUNCE and the EXT-X-SKIP tag are expected to occur before any Media Segments.
385+
//
386+
// For EXT-X-MEDIA-SEQUNCE section 4.4.3.2 indicates:
387+
// The EXT-X-MEDIA-SEQUENCE tag MUST appear before the first Media Segment in the Playlist.
388+
//
389+
// For EXT-X-SKIP section 4.4.5.2 indicates:
390+
// A server produces a Playlist Delta Update (Section 6.2.5.1), by replacing tags earlier than the
391+
// Skip Boundary with an EXT-X-SKIP tag. When replacing Media Segments, the EXT-X-SKIP tag replaces
392+
// the segment URI lines and all Media Segment Tags tags that are applied to those segments.
393+
//
394+
// Exiting early at the first Location helps us avoid having to loop through the entire playlist when we
395+
// know that the tags we're looking for MUST NOT exist.
396+
break
397+
default: continue
382398
}
383399
}
384-
400+
401+
// figure out our media sequence start (defaults to 0 if not specified)
402+
if let startMediaSequence: MediaSequence = mediaSequenceTag?.value(forValueIdentifier: PantosValue.sequence) {
403+
currentMediaSequence = startMediaSequence
404+
}
405+
406+
// account for any skip tag (since a delta update replaces all segments earlier than the skip boundary, the
407+
// SKIPPED-SEGMENTS value will effectively update the current media sequence value of the first segment, so safe
408+
// to do this here and not within the looping through media group tags below).
409+
if let skippedSegments: Int = skipTag?.value(forValueIdentifier: PantosValue.skippedSegments) {
410+
currentMediaSequence += skippedSegments
411+
}
412+
385413
// find the "header" portion by finding the first ".mediaSegment" scoped tag
386414
let mediaStartIndexOptional = tags.firstIndex(where: { $0.scope() == .mediaSegment })
387415

0 commit comments

Comments
 (0)