Skip to content

Commit fe51766

Browse files
committed
Added checks for ContainerConstraintsSubDescriptor to be present (per ST 379-2)
1 parent 4014d48 commit fe51766

File tree

7 files changed

+849
-11
lines changed

7 files changed

+849
-11
lines changed

src/main/java/com/netflix/imflibrary/st2067_202/IMFISXDConstraintsChecker.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public static List<ErrorLogger.ErrorObject> checkISXDVirtualTrack(Composition.Ed
3636
imfTrackFileResourceType.getSourceEncoding(), domNodeObjectModel.getLocalName()));
3737
}
3838

39+
if (domNodeObjectModel.getChildrenDOMNodes().size() == 0) {
40+
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("EssenceDescriptor ID %s referenced by " +
41+
"an ISXD VirtualTrack Resource has no SubDescriptor, but a ContainerConstraintsSubDescriptor shall be present per ST 379-2.", imfTrackFileResourceType.getSourceEncoding()));
42+
}
43+
3944
// Per ST 2067-202 Section 6: The Edit Rate of an ISXD Virtual Track shall be equal to the Edit Rate of the Main Image Virtual Track as defined in SMPTE ST 2067-2.
4045
if (imfTrackFileResourceType.getEditRate().getNumerator() * compositionEditRate.getDenominator() !=
4146
imfTrackFileResourceType.getEditRate().getDenominator() * compositionEditRate.getNumerator()) {

src/main/java/com/netflix/imflibrary/st2067_202/ISXDTrackFileConstraints.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
import com.netflix.imflibrary.st0377.IndexTableSegment;
88
import com.netflix.imflibrary.st0377.header.*;
99

10+
import com.netflix.imflibrary.st379_2.ContainerConstraintsSubDescriptor;
1011
import jakarta.annotation.Nonnull;
1112
import java.io.IOException;
1213
import java.util.List;
1314
import java.util.UUID;
15+
import java.util.stream.Collectors;
1416

1517
public final class ISXDTrackFileConstraints {
1618

@@ -22,27 +24,25 @@ public ISXDTrackFileConstraints() {}
2224
public static void checkCompliance(IMFConstraints.HeaderPartitionIMF headerPartitionIMF, @Nonnull IMFErrorLogger imfErrorLogger) throws IOException {
2325
HeaderPartition headerPartition = headerPartitionIMF.getHeaderPartitionOP1A().getHeaderPartition();
2426
List<UL> partitionPackEssenceContainerULs = headerPartition.getPartitionPack().getEssenceContainerULs();
27+
List<InterchangeObject.InterchangeObjectBO> subDescriptors = headerPartition.getSubDescriptors();
28+
Preface preface = headerPartition.getPreface();
29+
GenericPackage genericPackage = preface.getContentStorage().getEssenceContainerDataList().get(0).getLinkedPackage();
30+
SourcePackage filePackage = (SourcePackage) genericPackage;
31+
UUID packageID = filePackage.getPackageMaterialNumberasUUID();
2532

2633
// Ensure that Essence Container UL in the Partition Pack is the one for ISXD
2734
if (!partitionPackEssenceContainerULs.contains(ISXDDataEssenceDescriptor.getEssenceContainerUL())) {
2835
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, IMF_ISXD_EXCEPTION_PREFIX +
2936
String.format("The MXF Partition Pack does not contain the ISXD Data Essence Container UL."));
3037
}
3138

32-
Preface preface = headerPartition.getPreface();
33-
3439
// Ensure that Essence Container UL in the Preface is the one for ISXD
3540
List<UL> prefaceEssenceContainerULs = preface.getEssenceContainerULs();
3641
if (!prefaceEssenceContainerULs.contains(ISXDDataEssenceDescriptor.getEssenceContainerUL())) {
3742
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, IMF_ISXD_EXCEPTION_PREFIX +
3843
String.format("The MXF Preface does not contain the ISXD Data Essence Container UL."));
3944
}
4045

41-
GenericPackage genericPackage = preface.getContentStorage().getEssenceContainerDataList().get(0).getLinkedPackage();
42-
SourcePackage filePackage;
43-
filePackage = (SourcePackage) genericPackage;
44-
UUID packageID = filePackage.getPackageMaterialNumberasUUID();
45-
4646
for (TimelineTrack timelineTrack : filePackage.getTimelineTracks()) {
4747
Sequence sequence = timelineTrack.getSequence();
4848
if (sequence == null) {
@@ -65,6 +65,25 @@ public static void checkCompliance(IMFConstraints.HeaderPartitionIMF headerParti
6565
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, IMF_ISXD_EXCEPTION_PREFIX +
6666
String.format("Data Essence Coding shall be %s but is %s.", ISXDDataEssenceDescriptor.UTF8_TEXT_DATA_ESSENCE_CODING_LABEL.toString(), isxdEssenceDescriptor.getDataEssenceCoding().toString()));
6767
}
68+
69+
if (subDescriptors.size() == 0) {
70+
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_COMPONENT_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, IMF_ISXD_EXCEPTION_PREFIX +
71+
String.format("ISXDDataEssenceDescriptor in the IMFTrackFile represented by ID %s does not have subdescriptors, but a ContainerConstraintsSubDescriptor shall be present per ST 379-2.", packageID.toString()));
72+
} else {
73+
//
74+
// ContainerConstraintsSubDescriptor (ST 379-2)
75+
//
76+
List<InterchangeObject.InterchangeObjectBO> containerConstraintsSubDescriptors = subDescriptors.subList(0, subDescriptors.size()).stream().filter(interchangeObjectBO -> interchangeObjectBO.getClass().getEnclosingClass().equals(ContainerConstraintsSubDescriptor.class)).collect(Collectors.toList());
77+
if (containerConstraintsSubDescriptors.isEmpty()) {
78+
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_COMPONENT_ERROR,
79+
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
80+
String.format("Track File with ID %s: A ContainerConstraintsSubDescriptor shall be present per ST 379-2, but is missing", packageID.toString()));
81+
} else if (containerConstraintsSubDescriptors.size() != 1) {
82+
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_ESSENCE_COMPONENT_ERROR,
83+
IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL,
84+
String.format("Track File with ID %s: One ContainerConstraintsSubDescriptor shall be present per ST 379-2, but %d are present", packageID.toString(), containerConstraintsSubDescriptors.size()));
85+
}
86+
}
6887
}
6988
}
7089
}

src/test/java/com/netflix/imflibrary/st2067_202/IMPAnalyzerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ public void IMPAnalyzerTest() throws IOException
2424
errorMap.entrySet().stream().forEach( e ->
2525
{
2626
if (e.getKey().matches("CPL_ISXD_TEST_1.xml")) {
27-
Assert.assertEquals(e.getValue().size(), 4);
27+
Assert.assertEquals(e.getValue().size(), 5);
2828
} else if (e.getKey().matches("ISXD_TEST_1_01_dovi_isxd.mxf")) {
29-
Assert.assertEquals(e.getValue().size(), 3);
29+
Assert.assertEquals(e.getValue().size(), 4);
3030
} else {
3131
Assert.assertEquals(e.getValue().size(), 0);
3232
}

src/test/java/com/netflix/imflibrary/st2067_202/ISXDCompositionTest.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,32 @@
1515
@Test(groups = "unit")
1616
public class ISXDCompositionTest {
1717

18+
@Test
19+
public void compositionTest() throws IOException {
20+
Path inputFile = TestHelper.findResourceByPath
21+
("TestIMP/ISXD/CPL_ISXD_TEST_1.xml");
22+
IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
23+
24+
IMFCompositionPlaylist imfCompositionPlaylist = new IMFCompositionPlaylist(inputFile);
25+
imfErrorLogger.addAllErrors(imfCompositionPlaylist.getErrors());
26+
imfErrorLogger.addAllErrors(IMPValidator.validateComposition(imfCompositionPlaylist, null));
27+
28+
Assert.assertEquals(imfErrorLogger.getErrors().size(), 0);
29+
}
30+
31+
@Test
32+
public void compositionSubDescriptorMissingTest() throws IOException {
33+
Path inputFile = TestHelper.findResourceByPath
34+
("TestIMP/ISXD/CPL_ISXD_TEST_SubDescriptorMissingTest.xml");
35+
IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
36+
37+
IMFCompositionPlaylist imfCompositionPlaylist = new IMFCompositionPlaylist(inputFile);
38+
imfErrorLogger.addAllErrors(imfCompositionPlaylist.getErrors());
39+
imfErrorLogger.addAllErrors(IMPValidator.validateComposition(imfCompositionPlaylist, null));
40+
41+
Assert.assertEquals(imfErrorLogger.getErrors().size(), 1);
42+
}
43+
1844
@Test
1945
public void compositionNotHomogeneousTest() throws IOException {
2046
Path inputFile = TestHelper.findResourceByPath
@@ -25,7 +51,7 @@ public void compositionNotHomogeneousTest() throws IOException {
2551
imfErrorLogger.addAllErrors(imfCompositionPlaylist.getErrors());
2652
imfErrorLogger.addAllErrors(IMPValidator.validateComposition(imfCompositionPlaylist, null));
2753

28-
Assert.assertEquals(imfErrorLogger.getErrors().size(), 1);
54+
Assert.assertEquals(imfErrorLogger.getErrors().size(), 3);
2955
Assert.assertTrue(imfErrorLogger.getErrors().get(0).getErrorDescription().contains("not homogeneous"));
3056
}
3157

@@ -39,8 +65,23 @@ public void compositionEditRateMismatchTest() throws IOException {
3965
imfErrorLogger.addAllErrors(imfCompositionPlaylist.getErrors());
4066
imfErrorLogger.addAllErrors(IMPValidator.validateComposition(imfCompositionPlaylist, null));
4167

68+
Assert.assertEquals(imfErrorLogger.getErrors().size(), 2);
69+
Assert.assertTrue(imfErrorLogger.getErrors().stream()
70+
.anyMatch(e -> e.getErrorDescription().contains("not equal")));
71+
}
72+
73+
@Test
74+
public void compositionEmptyIsxdTrackTest() throws IOException {
75+
Path inputFile = TestHelper.findResourceByPath
76+
("TestIMP/ISXD/CPL_ISXD_TEST_EmptyIsxdTrack.xml");
77+
IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
78+
79+
IMFCompositionPlaylist imfCompositionPlaylist = new IMFCompositionPlaylist(inputFile);
80+
imfErrorLogger.addAllErrors(imfCompositionPlaylist.getErrors());
81+
imfErrorLogger.addAllErrors(IMPValidator.validateComposition(imfCompositionPlaylist, null));
82+
4283
Assert.assertEquals(imfErrorLogger.getErrors().size(), 1);
43-
Assert.assertTrue(imfErrorLogger.getErrors().get(0).getErrorDescription().contains("not equal"));
84+
Assert.assertTrue(imfErrorLogger.getErrors().get(0).getErrorDescription().contains("associated resources"));
4485
}
4586

4687
}

0 commit comments

Comments
 (0)