Allow verification of 428-7-2014 subtitles.
authorCarl Hetherington <cth@carlh.net>
Sun, 11 Dec 2022 21:26:46 +0000 (22:26 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 17 Feb 2023 23:35:01 +0000 (00:35 +0100)
src/verify.cc
xsd/DCDMSubtitle-2014.xsd [new file with mode: 0644]

index ed6c78d600b70109fe7ae6ab7c2bcfe2f2ce0d7d..7cc6d3572b69fcc5897e6cf4a7262586f404fd29 100644 (file)
@@ -242,7 +242,8 @@ public:
                add("http://www.digicine.com/PROTO-ASDCP-AM-20040311.xsd", "PROTO-ASDCP-AM-20040311.xsd");
                add("http://www.digicine.com/PROTO-ASDCP-CC-CPL-20070926#", "PROTO-ASDCP-CC-CPL-20070926.xsd");
                add("interop-subs", "DCSubtitle.v1.mattsson.xsd");
-               add("http://www.smpte-ra.org/schemas/428-7/2010/DCST.xsd", "SMPTE-428-7-2010-DCST.xsd");
+               add("http://www.smpte-ra.org/schemas/428-7/2010/DCST.xsd", "DCDMSubtitle-2010.xsd");
+               add("http://www.smpte-ra.org/schemas/428-7/2014/DCST.xsd", "DCDMSubtitle-2014.xsd");
                add("http://www.smpte-ra.org/schemas/429-16/2014/CPL-Metadata", "SMPTE-429-16.xsd");
                add("http://www.dolby.com/schemas/2012/AD", "Dolby-2012-AD.xsd");
                add("http://www.smpte-ra.org/schemas/429-10/2008/Main-Stereo-Picture-CPL", "SMPTE-429-10-2008.xsd");
@@ -321,6 +322,7 @@ validate_xml (T xml, boost::filesystem::path xsd_dtd_directory, vector<Verificat
                schema.push_back("PROTO-ASDCP-AM-20040311.xsd");
                schema.push_back("DCSubtitle.v1.mattsson.xsd");
                schema.push_back("DCDMSubtitle-2010.xsd");
+               schema.push_back("DCDMSubtitle-2014.xsd");
                schema.push_back("PROTO-ASDCP-CC-CPL-20070926.xsd");
                schema.push_back("SMPTE-429-16.xsd");
                schema.push_back("Dolby-2012-AD.xsd");
diff --git a/xsd/DCDMSubtitle-2014.xsd b/xsd/DCDMSubtitle-2014.xsd
new file mode 100644 (file)
index 0000000..a1be95f
--- /dev/null
@@ -0,0 +1,448 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<xs:schema\r
+    targetNamespace="http://www.smpte-ra.org/schemas/428-7/2014/DCST"\r
+    xmlns:dcst="http://www.smpte-ra.org/schemas/428-7/2014/DCST"\r
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"\r
+    elementFormDefault="qualified" attributeFormDefault="unqualified">\r
+\r
+  <!-- SubtitleReel -->\r
+  <xs:element name="SubtitleReel" type="dcst:SubtitleReelType"/>\r
+  <xs:complexType name="SubtitleReelType">\r
+    <xs:sequence>\r
+      <xs:element name="Id" type="dcst:UUID"/>\r
+      <xs:element name="ContentTitleText" type="dcst:UserText"/>\r
+      <xs:element name="AnnotationText" type="dcst:UserText" minOccurs="0"/>\r
+      <xs:element name="IssueDate" type="xs:dateTime"/>\r
+      <xs:element name="ReelNumber" type="xs:positiveInteger" minOccurs="0"/>\r
+      <xs:element name="Language" type="xs:language" minOccurs="0" default="en"/>\r
+      <xs:element name="EditRate" type="dcst:RationalType"/>\r
+      <xs:element name="TimeCodeRate" type="xs:positiveInteger"/>\r
+      <xs:element name="StartTime" type="dcst:TimeCodeType" minOccurs="0"/>\r
+      <xs:element name="DisplayType" type="dcst:scopedTokenType" minOccurs="0"/>\r
+      <xs:element name="LoadFont" minOccurs="0" maxOccurs="unbounded">\r
+        <xs:complexType>\r
+          <xs:simpleContent>\r
+            <xs:extension base="xs:anyURI">\r
+              <xs:attribute name="ID" type="xs:string"/>\r
+            </xs:extension>\r
+          </xs:simpleContent>\r
+        </xs:complexType>\r
+      </xs:element>\r
+      <xs:element name="SubtitleList">\r
+        <xs:complexType>\r
+          <xs:choice maxOccurs="unbounded">\r
+            <xs:element name="Subtitle" type="dcst:SubtitleType"/>\r
+            <xs:element name="Font">\r
+              <xs:complexType mixed="true">\r
+                <xs:complexContent mixed="true">\r
+                  <xs:extension base="dcst:FontType">\r
+                    <xs:sequence>\r
+                      <xs:element name="Subtitle" type="dcst:SubtitleType" maxOccurs="unbounded"/>\r
+                    </xs:sequence>\r
+                  </xs:extension>\r
+                </xs:complexContent>\r
+              </xs:complexType>\r
+            </xs:element>\r
+          </xs:choice>\r
+        </xs:complexType>\r
+      </xs:element>\r
+    </xs:sequence>\r
+    <xs:attribute name="IntrinsicPictureResolution" type="xs:string" use="optional"/>\r
+  </xs:complexType>\r
+\r
+  <!-- Subtitle -->\r
+  <xs:complexType name="SubtitleType">\r
+    <xs:sequence>\r
+      <xs:element name="LoadVariableZ" minOccurs="0" maxOccurs="unbounded">\r
+        <xs:complexType>\r
+          <xs:simpleContent>\r
+           <xs:extension base="xs:string">\r
+             <xs:attribute name="ID" type="xs:string" use="required"/>\r
+           </xs:extension>\r
+         </xs:simpleContent>\r
+        </xs:complexType>\r
+      </xs:element>\r
+      <xs:choice maxOccurs="unbounded">\r
+        <xs:element name="Text" type="dcst:TextType"/>\r
+        <xs:element name="Image" type="dcst:ImageType"/>\r
+        <xs:element name="Font">\r
+          <xs:complexType mixed="true">\r
+            <xs:complexContent mixed="true">\r
+              <xs:extension base="dcst:FontType">\r
+                <xs:sequence>\r
+                  <xs:element name="Text" type="dcst:TextType" maxOccurs="unbounded"/>\r
+                </xs:sequence>\r
+              </xs:extension>\r
+            </xs:complexContent>\r
+          </xs:complexType>\r
+        </xs:element>\r
+      </xs:choice>\r
+    </xs:sequence>\r
+    <xs:attribute name="SpotNumber" type="xs:string" use="optional"/>\r
+    <xs:attribute name="TimeIn" type="dcst:TimeCodeType" use="required"/>\r
+    <xs:attribute name="TimeOut" type="dcst:TimeCodeType" use="required"/>\r
+    <xs:attribute name="FadeUpTime" type="dcst:TimeCodeType" use="optional"/>\r
+    <xs:attribute name="FadeDownTime" type="dcst:TimeCodeType" use="optional"/>\r
+  </xs:complexType>\r
+\r
+  <!-- Image -->\r
+  <xs:complexType name="ImageType" mixed="false">\r
+    <xs:simpleContent>\r
+      <xs:extension base="xs:anyURI">\r
+        <xs:attribute name="Halign" use="optional" default="center">\r
+          <xs:simpleType>\r
+            <xs:restriction base="xs:string">\r
+              <xs:enumeration value="center"/>\r
+              <xs:enumeration value="left"/>\r
+              <xs:enumeration value="right"/>\r
+            </xs:restriction>\r
+          </xs:simpleType>\r
+        </xs:attribute>\r
+        <xs:attribute name="Hposition" use="optional" default="0">\r
+          <xs:simpleType>\r
+            <xs:restriction base="xs:decimal">\r
+              <xs:minInclusive value="-100"/>\r
+              <xs:maxInclusive value="100"/>\r
+            </xs:restriction>\r
+          </xs:simpleType>\r
+        </xs:attribute>\r
+        <xs:attribute name="Valign" use="optional" default="center">\r
+          <xs:simpleType>\r
+            <xs:restriction base="xs:string">\r
+              <xs:enumeration value="center"/>\r
+              <xs:enumeration value="bottom"/>\r
+              <xs:enumeration value="top"/>\r
+            </xs:restriction>\r
+          </xs:simpleType>\r
+        </xs:attribute>\r
+        <xs:attribute name="Vposition" use="optional" default="0">\r
+          <xs:simpleType>\r
+            <xs:restriction base="xs:decimal">\r
+              <xs:minInclusive value="-100"/>\r
+              <xs:maxInclusive value="100"/>\r
+            </xs:restriction>\r
+          </xs:simpleType>\r
+        </xs:attribute>\r
+       <xs:attribute name="Zposition" use="optional" default="0">\r
+         <xs:simpleType>\r
+           <xs:restriction base="xs:decimal">\r
+             <xs:minInclusive value="-100"/>\r
+             <xs:maxInclusive value="100"/>\r
+           </xs:restriction>\r
+         </xs:simpleType>\r
+       </xs:attribute>\r
+       <xs:attribute name="VariableZ" use="optional">\r
+         <xs:simpleType>\r
+           <xs:restriction base="xs:string"/>\r
+          </xs:simpleType>\r
+       </xs:attribute>\r
+      </xs:extension>\r
+    </xs:simpleContent>\r
+  </xs:complexType>\r
+\r
+  <!-- Font -->\r
+  <xs:complexType name="FontType" mixed="true">\r
+    <xs:attribute name="Script" use="optional" default="normal">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="normal"/>\r
+          <xs:enumeration value="super"/>\r
+          <xs:enumeration value="sub"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Effect" use="optional" default="shadow">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="none"/>\r
+          <xs:enumeration value="border"/>\r
+          <xs:enumeration value="shadow"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Italic" use="optional" default="no">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="yes"/>\r
+          <xs:enumeration value="no"/>\r
+          <xs:enumeration value="left"/>\r
+          <xs:enumeration value="right"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Underline" use="optional" default="no">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="yes"/>\r
+          <xs:enumeration value="no"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Weight" use="optional" default="normal">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="bold"/>\r
+          <xs:enumeration value="normal"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="ID" type="xs:string" use="optional"/>\r
+    <xs:attribute name="Color" use="optional" default="FFFFFFFF">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:hexBinary">\r
+          <xs:length value="4"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="EffectColor" use="optional" default="FF000000">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:hexBinary">\r
+          <xs:length value="4"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Size" use="optional" default="42">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:positiveInteger"/>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="AspectAdjust" use="optional" default="1.0">\r
+      <xs:simpleType>\r
+       <xs:restriction base="xs:decimal">\r
+         <xs:minInclusive value="0.25"/>\r
+         <xs:maxInclusive value="4.0"/>\r
+       </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Spacing" use="optional" default="0.0">\r
+      <xs:simpleType>\r
+       <xs:restriction base="xs:decimal">\r
+         <xs:minInclusive value="-1.0"/>\r
+       </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="EffectSize" use="optional" default="0.01">\r
+      <xs:simpleType>\r
+       <xs:restriction base="xs:decimal">\r
+         <xs:minInclusive value="0.0"/>\r
+       </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Feather" use="optional" default="no">\r
+      <xs:simpleType>\r
+       <xs:restriction base="xs:string">\r
+         <xs:enumeration value="yes"/>\r
+         <xs:enumeration value="no"/>\r
+       </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+  </xs:complexType>\r
+\r
+  <!-- Text -->\r
+  <xs:complexType name="TextType" mixed="true">\r
+    <xs:choice minOccurs="0" maxOccurs="unbounded">\r
+      <xs:element name="Font" type="dcst:FontType"/>\r
+      <xs:element name="Ruby" type="dcst:RubyType"/>\r
+      <xs:element name="Space" type="dcst:SpaceType"/>\r
+      <xs:element name="HGroup" type="xs:string"/>\r
+      <xs:element name="Rotate" type="dcst:RotateType"/>\r
+    </xs:choice>\r
+    <xs:attribute name="Halign" use="optional" default="center">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="center"/>\r
+          <xs:enumeration value="left"/>\r
+          <xs:enumeration value="right"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Hposition" use="optional" default="0">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:decimal">\r
+          <xs:minInclusive value="-100"/>\r
+          <xs:maxInclusive value="100"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Valign" use="optional" default="center">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="center"/>\r
+          <xs:enumeration value="bottom"/>\r
+          <xs:enumeration value="top"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Vposition" use="optional" default="0">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:decimal">\r
+          <xs:minInclusive value="-100"/>\r
+          <xs:maxInclusive value="100"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Direction" use="optional" default="ltr">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:string">\r
+          <xs:enumeration value="ltr"/>\r
+          <xs:enumeration value="rtl"/>\r
+          <xs:enumeration value="ttb"/>\r
+          <xs:enumeration value="btt"/>\r
+          <xs:enumeration value="hor"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="Zposition" use="optional" default="0">\r
+      <xs:simpleType>\r
+        <xs:restriction base="xs:decimal">\r
+          <xs:minInclusive value="-100"/>\r
+         <xs:maxInclusive value="100"/>\r
+        </xs:restriction>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+    <xs:attribute name="VariableZ" use="optional">\r
+      <xs:simpleType>\r
+       <xs:restriction base="xs:string"/>\r
+      </xs:simpleType>\r
+    </xs:attribute>\r
+  </xs:complexType>\r
+\r
+  <!-- Rational Type -->\r
+  <xs:simpleType name="RationalType">\r
+    <xs:restriction>\r
+      <xs:simpleType>\r
+        <xs:list itemType="xs:long"/>\r
+      </xs:simpleType>\r
+      <xs:length value="2"/>\r
+    </xs:restriction>\r
+  </xs:simpleType>\r
+\r
+  <!-- TimeCode Type -->\r
+  <xs:simpleType name="TimeCodeType">\r
+    <xs:restriction base="xs:string">\r
+       <xs:pattern value="[0-2][0-9]:[0-5][0-9]:[0-5][0-9]:[0-9]+"/>\r
+    </xs:restriction>\r
+  </xs:simpleType>\r
+\r
+  <!-- Ruby Type -->\r
+  <xs:complexType name="RubyType">\r
+    <xs:sequence>\r
+      <xs:element name="Rb">\r
+        <xs:simpleType>\r
+         <xs:restriction base="xs:string">\r
+           <xs:minLength value="1"/>\r
+         </xs:restriction>\r
+       </xs:simpleType>\r
+      </xs:element>\r
+      <xs:element name="Rt">\r
+        <xs:complexType>\r
+          <xs:simpleContent>\r
+            <xs:extension base="xs:string">\r
+              <xs:attribute name="Size" use="optional" default="0.5">\r
+               <xs:simpleType>\r
+                 <xs:restriction base="xs:decimal">\r
+                   <xs:minExclusive value="0"/>\r
+                 </xs:restriction>\r
+               </xs:simpleType>\r
+             </xs:attribute>\r
+              <xs:attribute name="Position" use="optional" default="before">\r
+                <xs:simpleType>\r
+                  <xs:restriction base="xs:string">\r
+                    <xs:enumeration value="before"/>\r
+                    <xs:enumeration value="after"/>\r
+                  </xs:restriction>\r
+                </xs:simpleType>\r
+              </xs:attribute>\r
+              <xs:attribute name="Offset" use="optional" default="0.0">\r
+               <xs:simpleType>\r
+                 <xs:restriction base="xs:decimal">\r
+                   <xs:minInclusive value="-1.0"/>\r
+                 </xs:restriction>\r
+               </xs:simpleType>\r
+             </xs:attribute>\r
+              <xs:attribute name="Spacing" use="optional" default="0.0">\r
+               <xs:simpleType>\r
+                 <xs:restriction base="xs:decimal">\r
+                   <xs:minInclusive value="-1.0"/>\r
+                  </xs:restriction>\r
+               </xs:simpleType>\r
+             </xs:attribute>\r
+              <xs:attribute name="AspectAdjust" use="optional" default="1.0">\r
+               <xs:simpleType>\r
+                 <xs:restriction base="xs:decimal">\r
+                   <xs:minInclusive value="0.25"/>\r
+                   <xs:maxInclusive value="4.0"/>\r
+                 </xs:restriction>\r
+               </xs:simpleType>\r
+             </xs:attribute>\r
+            </xs:extension>\r
+          </xs:simpleContent>\r
+        </xs:complexType>\r
+      </xs:element>\r
+    </xs:sequence>\r
+  </xs:complexType>\r
+\r
+  <!-- Rotate Type -->\r
+  <xs:complexType name="RotateType">\r
+    <xs:simpleContent>\r
+      <xs:extension base="xs:string">\r
+        <xs:attribute name="Direction" use="optional" default="none">\r
+          <xs:simpleType>\r
+            <xs:restriction base="xs:string">\r
+              <xs:enumeration value="none"/>\r
+              <xs:enumeration value="left"/>\r
+              <xs:enumeration value="right"/>\r
+            </xs:restriction>\r
+          </xs:simpleType>\r
+        </xs:attribute>\r
+      </xs:extension>\r
+    </xs:simpleContent>\r
+  </xs:complexType>\r
+\r
+  <!-- Space Type -->\r
+  <xs:complexType name="SpaceType">\r
+    <xs:simpleContent>\r
+      <xs:extension base="dcst:EmptyElement">\r
+        <xs:attribute name="Size" use="optional" default="0.5">\r
+          <xs:simpleType>\r
+           <xs:restriction base="xs:decimal">\r
+             <xs:minInclusive value="-1.0"/>\r
+           </xs:restriction>\r
+          </xs:simpleType>\r
+        </xs:attribute>\r
+      </xs:extension>\r
+    </xs:simpleContent>\r
+  </xs:complexType>\r
+\r
+  <!-- UUID Type -->\r
+  <xs:simpleType name="UUID">\r
+    <xs:restriction base="xs:anyURI">\r
+      <xs:pattern value="urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"/>\r
+    </xs:restriction>\r
+  </xs:simpleType>\r
+\r
+  <!-- UserText Type -->\r
+  <xs:complexType name="UserText">\r
+    <xs:simpleContent>\r
+      <xs:extension base="xs:string">\r
+        <xs:attribute name="language" type="xs:language" use="optional" default="en"/>\r
+      </xs:extension>\r
+    </xs:simpleContent>\r
+  </xs:complexType>\r
+\r
+  <!-- Scoped Token Type -->\r
+  <xs:complexType name="scopedTokenType">\r
+    <xs:simpleContent>\r
+      <xs:extension base="xs:token">\r
+      <xs:attribute name="scope" type="xs:anyURI" use="optional"/>\r
+      </xs:extension>\r
+    </xs:simpleContent>\r
+  </xs:complexType>\r
+\r
+  <!-- EmptyElement Type -->\r
+  <xs:simpleType name="EmptyElement">\r
+    <xs:restriction base="xs:string">\r
+      <xs:length value="0"/>\r
+    </xs:restriction>\r
+  </xs:simpleType>\r
+</xs:schema>\r