Skip to content

Commit

Permalink
Bug 25923 - Support arrays of initData types and audio/video types-ca…
Browse files Browse the repository at this point in the history
…pability pairs.
  • Loading branch information
ddorwin committed Nov 20, 2014
1 parent 707e404 commit f349e81
Show file tree
Hide file tree
Showing 3 changed files with 280 additions and 167 deletions.
174 changes: 115 additions & 59 deletions encrypted-media-respec.html
Expand Up @@ -422,21 +422,31 @@ <h2>Is Combination Supported?</h2>
<p class="note">Unrecognized dictionary members in <var>combination</var> are ignored per [[WebIDL]], and will never reach this algorithm. Thus, they cannot be considered as part of the combination.</p>
<ol>
<li><p>Let <var>combined configuration</var> be empty.</p></li>
<li><p>If <a def-id="option-initDataType"></a> is not the empty string and the <var>implementation</var> does not support generating requests based on <a def-id="option-initDataType"></a>, return <code>Not Supported</code>. String comparison is case-sensitive.</p></li>
<li><p>Add <a def-id="option-initDataType"></a> to <var>combined configuration</var>.</p></li>
<li><p>If <a def-id="option-audioType"></a> is the empty string and <a def-id="option-audioCapability"></a> is not the empty string, return <code>Not Supported</code>.</p></li>
<li><p>If <a def-id="option-audioType"></a> is not the empty string, run the following steps:</p>
<li><p>If <a def-id="option-initDataTypes"></a> is not empty, run the following steps:</p>
<ol>
<li><p>Let <var>audio configuration</var> be the result of executing the <a def-id="get-supported-content-type-and-capability-configuration-algorithm"></a> algorithm on <a def-id="option-audioType"></a>, <a def-id="option-audioCapability"></a>, Audio, and <var>combined configuration</var>.</p></li>
<li><p>If <var>audio configuration</var> is <code>null</code>, return <code>Not Supported</code>.</p></li>
<li><p>Let <var>supported types</var> be empty.</p></li>
<li><p>For each value in <a def-id="option-initDataTypes"></a>:</p>
<ol>
<li><p>Let <var>initDataType</var> be the value.</p></li>
<li><p>If <var>initDataType</var> is the empty string, return <code>Not Supported</code>.</p></li><!-- Invalid input. -->
<li><p>If the <var>implementation</var> supports generating requests based on <var>initDataType</var>, add <var>initDataType</var> to <var>supported types</var>.</p></li>
</ol>
</li>
<li><p>If <var>supported types</var> is empty, return <code>Not Supported</code>. String comparison is case-sensitive.</p></li>
<li><p>Add <var>supported types</var> to <var>combined configuration</var>.</p></li>
</ol>
</li>
<li><p>If <a def-id="option-audioCapabilities"></a> is not empty, run the following steps:</p>
<ol>
<li><p>Let <var>audio configuration</var> be the result of executing the <a def-id="get-supported-capability-configurations-for-media-type-algorithm"></a> algorithm on Audio, <a def-id="option-audioCapabilities"></a>, and <var>combined configuration</var>.</p></li>
<li><p>If <var>audio configuration</var> is <code>null</code>, return <code>Not Supported</code>.</p></li><!-- Audio capabilities were specified, but none were supported. -->
<li><p>Add <var>audio configuration</var> to <var>combined configuration</var>.</p></li>
</ol>
</li>
<li><p>If <a def-id="option-videoType"></a> is the empty string and <a def-id="option-videoCapability"></a> is not the empty string, return <code>Not Supported</code>.</p></li>
<li><p>If <a def-id="option-videoType"></a> is not the empty string, run the following steps:</p>
<li><p>If <a def-id="option-videoCapabilities"></a> is not empty, run the following steps:</p>
<ol>
<li><p>Let <var>video configuration</var> be the result of executing the <a def-id="get-supported-content-type-and-capability-configuration-algorithm"></a> algorithm on <a def-id="option-videoType"></a>, <a def-id="option-videoCapability"></a>, Video, and <var>combined configuration</var>.</p></li>
<li><p>If <var>video configuration</var> is <code>null</code>, return <code>Not Supported</code>.</p></li>
<li><p>Let <var>video configuration</var> be the result of executing the <a def-id="get-supported-capability-configurations-for-media-type-algorithm"></a> algorithm on Video, <a def-id="option-videoCapabilities"></a>, and <var>combined configuration</var>.</p></li>
<li><p>If <var>video configuration</var> is <code>null</code>, return <code>Not Supported</code>.</p></li><!-- Video capabilities were specified, but none were supported. -->
<li><p>Add <var>video configuration</var> to <var>combined configuration</var>.</p></li>
</ol>
</li>
Expand All @@ -456,7 +466,7 @@ <h2>Is Combination Supported?</h2>
</dd>
</dl>
</li>
<li><p>Add the value of <a def-id="option-persistentUniqueIdentifier"></a> to <var>combined configuration</var>.
<li><p>Add <a def-id="option-persistentUniqueIdentifier"></a> and its value to <var>combined configuration</var>.
<li><p>Follow the steps for the value of <a def-id="option-persistentState"></a> from the following list:</p>
<dl class="switch">
<dt><a def-id="requirement-required"></a></dt>
Expand All @@ -473,7 +483,7 @@ <h2>Is Combination Supported?</h2>
</dd>
</dl>
</li>
<li><p>Add the value of <a def-id="option-persistentState"></a> to <var>combined configuration</var>.
<li><p>Add <a def-id="option-persistentState"></a> and its value to <var>combined configuration</var>.
<li><p>If <var>implementation</var> in the configuration specified by the combination of the values in <var>combined configuration</var> is not supported or not allowed in the <var>origin</var>, return <code>Not Supported</code>.</p>
<p class="note">In this step, "supported" includes the implementation being available for use when this algorithm returns, not just user agent support for such an implementation.</p>
</li>
Expand All @@ -482,45 +492,63 @@ <h2>Is Combination Supported?</h2>
</section>

<section>
<h2>Get Supported Content Type and Capability Configuration</h2>
<p>Given a string <var>contentType</var>, string <var>capability</var>, <var>media type</var> (Audio or Video), and <var>partial configuration</var>, this algorithm returns a supported configuration for this media type or <code>null</code> as appropriate.</p>
<h2>Get Supported Capability Configurations for Media Type</h2>
<p>Given a <var>media type</var> (Audio or Video), <a>MediaKeySystemMediaCapability</a> sequence <var>capabilities</var>, and <var>partial configuration</var>, this algorithm returns a list of supported configurations for this media type or <code>null</code> as appropriate.</p>
<ol>
<li><p>If <var>contentType</var> is an invalid or unrecognized MIME type, return <code>null</code>.</p></li>
<li><p>Let <var>configuration</var> be empty.</p></li>
<li><p>Let <var>container</var> be the container type specified by <var>contentType</var>.</p></li>
<li><p>If the user agent does not support <var>container</var>, return <code>null</code>. The case-sensitivity of string comparisons is determined by the appropriate RFC.</p>
<p class="note">Per RFC 6838 [[RFC6838]], "Both top-level type and subtype names are case-insensitive."</p>
</li>
<li><p>Add <var>container</var> to <var>configuration</var>.</p></li>
<li><p>Let <var>parameters</var> be the RFC 6381 [[!RFC6381]] parameters, if any, specified by <var>contentType</var>.</p></li>
<li><p>If <var>parameters</var> is not empty, run the following steps:</p>
<ol>
<li><p>If the user agent does not recognize one or more <var>parameters</var>, return <code>null</code>.</p></li>
<li><p>Let <var>media types</var> be the set of media types specified by <var>parameters</var>. It MAY be empty. The case-sensitivity of string comparisons is determined by the appropriate RFC or other specification.</p>
<p class="note">For example, all of the codecs. Case-sensitive string comparison is RECOMMENDED because RFC 6381 [[RFC6381]] says, "Values are case sensitive" for some formats.</p>
<li><p>Let <var>accumulated configuration</var> be <var>partial configuration</var>.</p></li>
<li><p>Let <var>media type configurations</var> be empty.</p></li>
<li><p>For each value in <var>capabilities</var>:</p>
<ol>
<li><p>Let <var>contentType</var> be the value's <a def-id="capability-contentType"></a> member.</p></li>
<li><p>Let <var>capability</var> be the value's <a def-id="capability-capability"></a> member.</p></li>
<li><p>If <var>contentType</var> is the empty string, return <code>null</code>.</p></li><!-- Invalid input. -->
<li><p>If <var>contentType</var> is an invalid or unrecognized MIME type, continue to the next iteration.</p></li>
<li><p>Let <var>configuration</var> be empty.</p></li>
<li><p>Let <var>container</var> be the container type specified by <var>contentType</var>.</p></li>
<li><p>If the user agent does not support <var>container</var>, continue to the next iteration. The case-sensitivity of string comparisons is determined by the appropriate RFC.</p>
<p class="note">Per RFC 6838 [[RFC6838]], "Both top-level type and subtype names are case-insensitive."</p>
</li>
<li><p>Add <var>container</var> to <var>configuration</var>.</p></li>
<li><p>Let <var>parameters</var> be the RFC 6381 [[!RFC6381]] parameters, if any, specified by <var>contentType</var>.</p></li>
<li><p>If <var>parameters</var> is not empty, run the following steps:</p>
<ol>
<li><p>If the user agent does not recognize one or more <var>parameters</var>, continue to the next iteration.</p></li>
<li><p>Let <var>media types</var> be the set of media types specified by <var>parameters</var>. It MAY be empty. The case-sensitivity of string comparisons is determined by the appropriate RFC or other specification.</p>
<p class="note">For example, all of the codecs. Case-sensitive string comparison is RECOMMENDED because RFC 6381 [[RFC6381]] says, "Values are case sensitive" for some formats.</p>
</li>
<li><p>Add all <var>media types</var> to <var>configuration</var>.</p></li>
</ol>
</li>
<li><p>If <var>contentType</var> is not a <var>media type</var> type, continue to the next iteration.</p>
<p class="note">For example, if <var>media type</var> is Audio and the top-level type is not "audio" or <var>media types</var> contains non-audio codecs.</p>
</li>
<li><p>If <var>capability</var> is not the empty string, run the following steps:</p>
<ol>
<li><p>If <var>capability</var> is an unrecognized value or not supported by <var>implementation</var>, continue to the next iteration. String comparison is case-sensitive.</p></li>
<li><p>Add <var>capability</var> to <var>configuration</var>.</p></li>
</ol>
</li>
<li><p>If the user agent and <var>implementation</var> do not support playback of encrypted <a def-id="media-data"></a> as specified by <var>configuration</var>, including all <var>media types</var>, in combination with <var>accumulated configuration</var>, continue to the next iteration.</p>
<p class="note">This configuration (content type and capability) must be supported with all previously added supported configurations.</p>
</li>
<li><p>Add <var>configuration</var> to <var>media type configurations</var>.</p></li>
<li><p>Add <var>configuration</var> to <var>accumulated configuration</var>.</p>
<p class="note">This step ensures that combinations of audio/video capabilities are always checked instead of only checking combinations of audio capabilities when checking a video capbility.</p>
</li>
<li><p>Add all <var>media types</var> to <var>configuration</var>.</p></li>
</ol>
</li>
<li><p>If <var>contentType</var> is not a <var>media type</var> type, return <code>null</code>.</p>
<p class="note">For example, if <var>media type</var> is Audio and the top-level type is not "audio" or <var>media types</var> contains non-audio codecs.</p>
</li>
<li><p>If <var>capability</var> is not the empty string, run the following steps:</p>
<ol>
<li><p>If <var>capability</var> is an unrecognized value or not supported by <var>implementation</var>, return <code>null</code>. String comparison is case-sensitive.</p></li>
<li><p>Add <var>capability</var> to <var>configuration</var>.</p></li>
</ol>
<li><p>If <var>media type configurations</var> is empty, return <code>null</code>.</p>
<p class="note">None of the <a>MediaKeySystemMediaCapability</a> elements in <var>capabilities</var> is supported in combination with <var>partial configuration</var>.</p>
</li>
<li><p>If the user agent and <var>implementation</var> do not support playback of encrypted <a def-id="media-data"></a> as specified by <var>configuration</var>, including all <var>media types</var>, in combination with <var>partial configuration</var>, return <code>null</code>.</p></li>
<li><p>Return <var>configuration</var>.</p></li>
<li><p>Return <var>media type configurations</var>.</p></li>
</ol>
</section>
</section>
</section>

<section>
<h2><a>MediaKeySystemOptions</a> dictionary</h2>
<p class="issue"><a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=25923">Bug 25923</a> - The structure of the <code>DOMString</code> members may change. If it is, other methods may be added.</p>
<p class="issue"><a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=25923">Bug 25923</a> - The structure of this dictionary may change, and methods may be added to <a>MediaKeySystemAccess</a>.</p>

<dl title="enum MediaKeysRequirement" class="idl">
<dt>required</dt>
Expand All @@ -536,25 +564,20 @@ <h2><a>MediaKeySystemOptions</a> dictionary</h2>
</dl>

<dl title="dictionary MediaKeySystemOptions" class='idl'>
<dt>DOMString initDataType = ""</dt>
<dt>sequence&lt;DOMString&gt; initDataTypes</dt>
<dd>
The required <a def-id="initialization-data-type"></a>.
A list of supported <a def-id="initialization-data-type"></a> names.
The <a def-id="initialization-data-type"></a> capability of this object is considered supported if the list is empty or contains at least one supported name.
</dd>
<dt>DOMString audioType = ""</dt>
<dt>sequence&lt;MediaKeySystemMediaCapability&gt; audioCapabilities</dt>
<dd>
The required audio content type.
A list of supported audio type and capability pairs.
The audio capability of this object is considered supported if the list is empty or contains at least one supported pair.
</dd>
<dt>DOMString audioCapability = ""</dt>
<dt>sequence&lt;MediaKeySystemMediaCapability&gt; videoCapabilities</dt>
<dd>
The required audio capability.
</dd>
<dt>DOMString videoType = ""</dt>
<dd>
The required video content type.
</dd>
<dt>DOMString videoCapability = ""</dt>
<dd>
The required video capability.
A list of supported video type and capability pairs.
The video capability of this object is considered supported if the list is empty or contains at least one supported pair.
</dd>
<dt>MediaKeysRequirement persistentUniqueIdentifier = "optional"</dt>
<dd>
Expand All @@ -575,6 +598,23 @@ <h2><a>MediaKeySystemOptions</a> dictionary</h2>
<p>This dictionary MUST NOT be used to pass state or data to the CDM.</p>

</section>

<section>
<h2><a>MediaKeySystemMediaCapability</a> dictionary</h2>
<dl title="dictionary MediaKeySystemMediaCapability" class='idl'>
<dt>DOMString contentType = ""</dt>
<dd>
The content type.
</dd>
<dt>DOMString capability = ""</dt>
<dd>
The capability associated with the content type.
</dd>
</dl>

<p>The entire <code>contentType</code>, including all codecs, must be supported with <code>capability</code> in order for the capability represented by this object to be considered supported.</p>
<p class="note">If any of a set of codecs is acceptable, use a separate instances of this dictionary for each codec.</p>
</section>
</section>


Expand Down Expand Up @@ -2104,15 +2144,31 @@ <h3>Selecting a Supported Key System and Using Initialization Data from the "enc
// Returns a Promise&lt;<a>MediaKeys</a>&gt;.
function createSupportedKeySystem() {
someSystemOptions = [
{ <a def-id="option-initDataType"></a>: "webm",
<a def-id="option-audioType"></a>: "audio/webm; codecs='vorbis'"
<a def-id="option-videoType"></a>: "video/webm; codecs='vp8'"
{ <a def-id="option-initDataTypes"></a>: ["keyids", "webm"],
<a def-id="option-audioCapabilities"></a>: [
{ <a def-id="capability-contentType"></a>: "audio/webm; codecs='opus'" },
{ <a def-id="capability-contentType"></a>: "audio/webm; codecs='vorbis'" }
],
<a def-id="option-videoCapabilities"></a>: [
{ <a def-id="capability-contentType"></a>: "video/webm; codecs='vp9'" },
{ <a def-id="capability-contentType"></a>: "video/webm; codecs='vp8'" }
]
}
];
clearKeyOptions = [
{ <a def-id="option-initDataType"></a>: "webm",
<a def-id="option-audioType"></a>: "audio/webm; codecs='vorbis'"
<a def-id="option-videoType"></a>: "video/webm; codecs='vp8'"
{ <a def-id="option-initDataTypes"></a>: ["keyids", "webm"],
<a def-id="option-audioCapabilities"></a>: [
{ <a def-id="capability-contentType"></a>: "audio/webm; codecs='opus'" },
{ <a def-id="capability-contentType"></a>: "audio/webm; codecs='vorbis'" }
],
<a def-id="option-videoCapabilities"></a>: [
{ <a def-id="capability-contentType"></a>: "video/webm; codecs='vp9'",
<a def-id="capability-capability"></a>: "foo" },
{ <a def-id="capability-contentType"></a>: "video/webm; codecs='vp9'",
<a def-id="capability-capability"></a>: "bar" },
{ <a def-id="capability-contentType"></a>: "video/webm; codecs='vp8'",
<a def-id="capability-capability"></a>: "bar" },
]
}
];

Expand Down

0 comments on commit f349e81

Please sign in to comment.