<?xml version="1.0"?>
<!-- ***************************************************************************
  
  This XML document was originally developed in the course of development of 
  the ISO/IEC 21000 standard (MPEG-21). This XML document contains either a 
  part of the MPEG-21 schema implementation for one or more MPEG-21 tools as 
  specified by the MPEG-21 Requirements or MPEG-21 examples conformant to the 
  MPEG-21 schemas.
  
  ISO/IEC gives users of MPEG-21 free license to this XML document or 
  modifications thereof for use in hardware or software products claiming 
  conformance to MPEG-21.
  
  Those intending to use this XML document in hardware or software products are 
  advised that its use may infringe existing patents. The original developers 
  of this XML document and his/her company, the subsequent editors and their 
  companies, and ISO/IEC have no liability for use of this XML document or 
  modifications thereof in an implementation.
  
  Copyright is not released for non MPEG-21 conforming products. The 
  organizations who contributed to this XML document retain the full right to 
  use the code for their own purpose, assign or donate their contribution to a 
  third party and inhibit third parties from using their contribution for non 
  MPEG-21 conforming products.
  
  Copyright (c) 2007 ISO/IEC. 
  
  This XML document is provided for informative purposes only. If any parts of 
  this XML document contradict the normative part of the corresponding standard 
  document then the normative part should be used as the definitive 
  specification.
  
  This notice must be included in all copies or derivative works.
**************************************************************************** -->
<!--=======================================
  ####################################################################
  # ISO/IEC 21000-18/AMD 1                                           #
  #   Information technology                                         #
  #   - Multimedia framework (MPEG-21)                               #
  #     - Part 18: Digital Item Streaming                            #
  #                                                                  #
  # Schema for Bitstream Binding Language (BBL)                      #
  #                                                                  #
  ####################################################################
=======================================-->
<xs:schema
  xmlns:bbl="urn:mpeg:mpeg21:2007:01-BBL-NS"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="urn:mpeg:mpeg21:2007:01-BBL-NS"
  elementFormDefault="qualified" attributeFormDefault="unqualified"
  version="1.0.0">
  <!-- ********************************************************************* -->
  <!--                          Abstract Type Declarations                ** -->
  <!-- ********************************************************************* -->
  <xs:attribute name="name" type="xs:QName"/>
  <!-- *********************************************************************** -->
  <xs:attribute name="value" type="xs:string"/>
  <!-- *********************************************************************** -->
  <xs:attribute name="match" type="xs:string" default="."/>
  <!-- *********************************************************************** -->
  <xs:attribute name="handler" type="xs:IDREF"/>
  <!-- *********************************************************************** -->
  <xs:attribute name="encoding" type="xs:IDREF"/>
  <!-- *********************************************************************** -->
  <xs:attributeGroup name="timeScheme">
    <xs:attribute name="timeScheme">
      <xs:simpleType>
        <xs:union>
          <xs:simpleType>
            <xs:restriction base="xs:NCName">
              <xs:enumeration value="npt"/>
              <xs:enumeration value="smpte-24"/>
              <xs:enumeration value="smpte-24-drop"/>
              <xs:enumeration value="smpte-25"/>
              <xs:enumeration value="smpte-30"/>
              <xs:enumeration value="smpte-30-drop"/>
              <xs:enumeration value="smpte-50"/>
              <xs:enumeration value="smpte-60"/>
              <xs:enumeration value="smpte-60-drop"/>
              <xs:enumeration value="mp7t"/>
              <xs:enumeration value="clock"/>
            </xs:restriction>
          </xs:simpleType>
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="frac\(\d+\)"/>
            </xs:restriction>
          </xs:simpleType>
          <xs:simpleType>
            <xs:restriction base="xs:string"/>
          </xs:simpleType>
        </xs:union>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <!-- *********************************************************************** -->
  <xs:complexType name="SourceElementType" abstract="true">
    <xs:attribute name="xmlSource" type="xs:string" use="optional"/>
    <xs:attribute name="binarySource" type="xs:string" use="optional"/>
    <xs:attribute name="bSrcNamespace" type="xs:string" use="optional"/>
    <xs:attributeGroup ref="bbl:timeScheme"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="IdentifiableElementType">
    <xs:complexContent>
      <xs:extension base="bbl:SourceElementType">
        <xs:attribute name="id" type="xs:ID" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="BBLDocType">
    <xs:complexContent>
      <xs:extension base="bbl:IdentifiableElementType">
        <xs:sequence>
          <xs:element name="Declarations" minOccurs="0"
                      type="bbl:DeclarationsType"/>
          <xs:element name="Variables" minOccurs="0" type="bbl:VariablesType"/>
          <xs:element name="Register" type="bbl:RegisterType"/>
          <xs:choice maxOccurs="unbounded">
            <xs:element name="Packet" type="bbl:PacketType"/>
            <xs:element name="PacketStream" type="bbl:PacketStreamType"/>
          </xs:choice>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="AbstractVarType">
    <xs:complexContent>
      <xs:extension base="bbl:SourceElementType">
        <xs:attribute ref="bbl:name" use="required"/>
        <xs:attribute ref="bbl:value" use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="ParametricElementType">
    <xs:complexContent>
      <xs:extension base="bbl:IdentifiableElementType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:any namespace="##other"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="AbstractPacketType" abstract="true">
    <xs:complexContent>
      <xs:extension base="bbl:IdentifiableElementType">
        <xs:sequence>
          <xs:element name="HandlerParams" type="bbl:ParametricElementType" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute ref="bbl:handler" use="optional"/>
        <xs:attribute name="deliveryCondition" type="xs:string" use="optional"/>
        <xs:attribute name="deliveryTime" type="xs:string" use="optional"/>
        <xs:attribute name="repeat" type="xs:float" use="optional" default="0.0"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="AbstractContentType">
    <xs:complexContent>
      <xs:extension base="bbl:IdentifiableElementType">
        <xs:sequence maxOccurs="unbounded">
          <xs:any namespace="##any" processContents="skip"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="TimingElementType">
    <xs:attribute ref="bbl:match" use="optional"/>
    <xs:attribute ref="bbl:value" use="required"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <!-- **                    BBL concrete types                             ** -->
  <!-- *********************************************************************** -->
  <xs:element name="BBL">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="Instance" type="bbl:InstanceType"/>
        <xs:element name="Binding" type="bbl:BindingType"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <!-- *********************************************************************** -->
  <xs:complexType name="InstanceType">
    <xs:complexContent>
      <xs:extension base="bbl:BBLDocType"/>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="BindingType">
    <xs:complexContent>
      <xs:extension base="bbl:BBLDocType"/>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="DeclarationsType">
    <xs:sequence maxOccurs="unbounded">
      <xs:any namespace="##any" processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="VariablesType">
    <xs:complexContent>
      <xs:extension base="bbl:SourceElementType">
        <xs:choice maxOccurs="unbounded">
          <xs:element name="Define" type="bbl:DefineType"/>
          <xs:element name="Assign" type="bbl:AbstractVarType"/>
        </xs:choice>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="RegisterType">
    <xs:complexContent>
      <xs:extension base="bbl:SourceElementType">
        <xs:sequence>
          <xs:element name="Handler" type="bbl:HandlerType" 
                      minOccurs="0" maxOccurs="unbounded"/>
           <xs:element name="Encoder" type="bbl:EncoderType"
                       minOccurs="0" maxOccurs="unbounded"/>
           <xs:element name="Multiplexer" type="bbl:MultiplexerType"
                       minOccurs="0" maxOccurs="unbounded"/>
          <xs:element name="BSD" type="bbl:BSDType"
                       minOccurs="0" maxOccurs="unbounded"/>
          <xs:element name="Function" type="bbl:FunctionType"
            minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="DefineType">
    <xs:complexContent>
      <xs:extension base="bbl:AbstractVarType">
        <xs:attribute name="type" type="bbl:VarType" use="optional" default="xs:int"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:simpleType name="VarType">
    <xs:restriction base="xs:QName">
      <xs:enumeration value="xs:integer"/>
      <xs:enumeration value="xs:int"/>
      <xs:enumeration value="xs:long"/>
      <xs:enumeration value="xs:short"/>
      <xs:enumeration value="xs:decimal"/>
      <xs:enumeration value="xs:float"/>
      <xs:enumeration value="xs:double"/>
      <xs:enumeration value="xs:boolean"/>
      <xs:enumeration value="xs:byte"/>
      <xs:enumeration value="xs:QName"/>
      <xs:enumeration value="xs:dateTime"/>
      <xs:enumeration value="xs:base64Binary"/>
      <xs:enumeration value="xs:hexBinary"/>
      <xs:enumeration value="xs:unsignedInt"/>
      <xs:enumeration value="xs:unsignedShort"/>
      <xs:enumeration value="xs:unsignedByte"/>
      <xs:enumeration value="xs:time"/>
      <xs:enumeration value="xs:date"/>
      <xs:enumeration value="xs:anySimpleType"/>
    </xs:restriction>
  </xs:simpleType>
  <!-- *********************************************************************** -->
  <xs:complexType name="HandlerType">
    <xs:complexContent>
      <xs:extension base="bbl:ParametricElementType">
        <xs:attribute name="handlerURI" type="xs:anyURI" use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="EncoderType">
   <xs:complexContent>
     <xs:extension base="bbl:ParametricElementType">
       <xs:attribute name="encoderURI" type="xs:anyURI"
                     use="required"/>
     </xs:extension>
   </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="MultiplexerType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="Channel" type="bbl:ChannelType"/>
      <xs:element name="Multiplexer" type="bbl:MultiplexerType"/>
    </xs:choice>
    <xs:attribute ref="bbl:handler" use="optional"/>
    <xs:attribute name="mode" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:NCName">
          <xs:enumeration value="packetCount"/>
          <xs:enumeration value="bandwidth"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="weight" type="xs:int" use="optional" default="1"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="ChannelType">
    <xs:attribute name="id" type="xs:ID" use="required"/>
    <xs:attribute name="weight" type="xs:int" use="optional" default="1"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="BSDType">
    <xs:attribute name="namespace" type="xs:anyURI" use="required"/>
    <xs:attribute name="bsSchemaLocation" type="xs:anyURI" use="required"/>
    <xs:attribute name="fromBinarySource" type="xs:boolean" use="optional"
                  default="true"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="FunctionType">
    <xs:annotation>
      <xs:documentation>Defines an ECMAScript based XPath function</xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute ref="bbl:name" use="required"/>
        <xs:attribute name="args" type="xs:nonNegativeInteger" use="optional" default="0"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="PacketType">
    <xs:complexContent>
      <xs:extension base="bbl:AbstractPacketType">
        <xs:sequence>
          <xs:element name="Content" type="bbl:AbstractContentType"/>
          <xs:element name="Variables" type="bbl:VariablesType" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="PacketStreamType">
    <xs:complexContent>
      <xs:extension base="bbl:AbstractPacketType">
        <xs:sequence>
          <xs:choice>
            <xs:element name="ContentTemplate" type="bbl:AbstractContentType"/>
            <xs:element name="Bind" type="bbl:BindType"/>
          </xs:choice>
          <xs:element name="Variables" type="bbl:VariablesType" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="IncludeType">
    <xs:complexContent>
      <xs:extension base="bbl:SourceElementType">
        <xs:sequence>
          <xs:element name="Timing" type="bbl:TimingType" minOccurs="0"/>
          <xs:element name="Fragmentation" type="bbl:FragmentationType"
                      minOccurs="0"/>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="bbl:Attribute"/>
            <xs:element name="Include" type="bbl:IncludeType"/>
            <xs:element name="Encode" type="bbl:EncodeType"/>
          </xs:choice>
        </xs:sequence>
        <xs:attribute name="ref" type="xs:string" use="required"/>
        <xs:attribute name="depth" use="optional" default="0">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="-1"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="height" use="optional" default="0">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="-1"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute ref="bbl:match" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType> 
  <!-- *********************************************************************** -->
  <xs:complexType name="TimingType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="DeliveryTimes" type="bbl:TimingElementType">
      </xs:element>
      <xs:element name="Durations" type="bbl:TimingElementType">
      </xs:element>
    </xs:choice>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="FragmentationType">
    <xs:sequence>
      <xs:element name="FragmentAt" type="bbl:FragmentAtType" minOccurs="0"
                  maxOccurs="unbounded"/>
      <xs:element name="Size" type="bbl:SizeType" minOccurs="0"/>
      <xs:element name="Duration" type="bbl:DurationType" minOccurs="0"/>
      <xs:element name="Count" type="bbl:CountType" minOccurs="0"
                  maxOccurs="unbounded"/>
      <xs:element name="Constraint" type="bbl:ConstraintType" minOccurs="0"
                  maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="attributes" use="optional" default="none">
      <xs:simpleType>
        <xs:restriction base="xs:NCName">
          <xs:enumeration value="none"/>
          <xs:enumeration value="id"/>
          <xs:enumeration value="context"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="FragmentAtType">
    <xs:attribute ref="bbl:match" use="required"/>
    <xs:attribute name="deliveryTime" type="xs:string" use="optional"/>
    <xs:attribute name="repeat" type="xs:string" use="optional" default="0"/>
    <xs:attribute name="id" type="xs:ID" use="optional"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="SizeType">
    <xs:attribute name="value" type="xs:positiveInteger" use="required"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="DurationType">
    <xs:attribute name="value" type="xs:string" use="required"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="CountType">
    <xs:attribute name="value" type="xs:positiveInteger" use="required"/>
    <xs:attribute ref="bbl:match" use="optional"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="ConstraintType">
    <xs:attribute name="type" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:NCName">
          <xs:enumeration value="first"/>
          <xs:enumeration value="last"/>
          <xs:enumeration value="unbroken"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute ref="bbl:match" use="optional"/>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="EncodeType">
    <xs:complexContent>
      <xs:extension base="bbl:ParametricElementType">
        <xs:attribute ref="bbl:encoding" use="required"/>
        <xs:attribute ref="bbl:match" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <xs:complexType name="BindType">
    <xs:complexContent>
      <xs:extension base="bbl:SourceElementType">
        <xs:sequence minOccurs="0">
          <xs:element name="Binding" type="bbl:BindingType"/>
        </xs:sequence>
        <xs:attribute name="bind" type="xs:string" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!-- *********************************************************************** -->
  <!-- ** Elts & Attrs used in BBL documents attached to non-bbl elements   ** -->
  <!-- *********************************************************************** -->
  <xs:element name="value-of">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="bbl:SourceElementType">
          <xs:attribute name="select" type="xs:string" use="required"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <!-- *********************************************************************** -->
  <xs:element name="Attribute">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="bbl:IdentifiableElementType">
          <xs:sequence>
            <xs:element ref="bbl:value-of" minOccurs="0"/>
          </xs:sequence>
          <xs:attribute ref="bbl:name" use="required"/>
          <xs:attribute ref="bbl:match" use="optional"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <!-- *********************************************************************** -->
  <!-- **  BBL attributes which are transmitted as part of xml fragments    ** -->
  <!-- *********************************************************************** -->
  <!-- *********************************************************************** -->
  <xs:attribute name="context" type="xs:string" fixed="$addr"/>
  <!-- *********************************************************************** -->
  <xs:attribute name="rap" type="xs:boolean" fixed="true"/>
  <!-- *********************************************************************** -->
  <xs:attribute name="seqNo" type="xs:integer"/>
  <!-- *********************************************************************** -->
  <xs:attribute name="processable" type="xs:boolean" default="true"/>
</xs:schema>