static parseElement_(elem) {
    const NS = shaka.dash.ContentProtection.CencNamespaceUri_;
    const TXml = shaka.util.TXml;

    /** @type {?string} */
    let schemeUri = elem.attributes['schemeIdUri'];
    /** @type {?string} */
    let keyId = TXml.getAttributeNS(elem, NS, 'default_KID');
    /** @type {!Array<string>} */
    const psshs = TXml.findChildrenNS(elem, NS, 'pssh')
        .map(TXml.getContents);

    const encryptionScheme = elem.attributes['value'];

    if (!schemeUri) {
      shaka.log.error('Missing required schemeIdUri attribute on',
          'ContentProtection element', elem);
      return null;
    }

    schemeUri = schemeUri.toLowerCase();
    if (keyId) {
      keyId = keyId.replace(/-/g, '').toLowerCase();
      if (keyId.includes(' ')) {
        throw new shaka.util.Error(
            shaka.util.Error.Severity.CRITICAL,
            shaka.util.Error.Category.MANIFEST,
            shaka.util.Error.Code.DASH_MULTIPLE_KEY_IDS_NOT_SUPPORTED);
      }
    }

    /** @type {!Array<shaka.extern.InitDataOverride>} */
    let init = [];
    try {
      // Try parsing PSSH data.
      init = psshs.map((pssh) => {
        return {
          initDataType: 'cenc',
          initData: shaka.util.Uint8ArrayUtils.fromBase64(pssh),
          keyId: null,
        };
      });
    } catch (e) {
      throw new shaka.util.Error(
          shaka.util.Error.Severity.CRITICAL,
          shaka.util.Error.Category.MANIFEST,
          shaka.util.Error.Code.DASH_PSSH_BAD_ENCODING);
    }

    return {
      node: elem,
      schemeUri,
      keyId,
      init: (init.length > 0 ? init : null),
      encryptionScheme,
    };
  }
Parses the given ContentProtection element.

@param {!shaka.extern.xml.Node} elem
@return {?shaka.dash.ContentProtection.Element}
@private