createStreamInfoFromIframeTag_(tag) {
    goog.asserts.assert(tag.name == 'EXT-X-I-FRAME-STREAM-INF',
        'Should only be called on iframe tags!');
    /** @type {string} */
    let type = shaka.util.ManifestParserUtils.ContentType.VIDEO;

    const verbatimIFramePlaylistUri = tag.getRequiredAttrValue('URI');
    const codecs = tag.getAttributeValue('CODECS') || '';

    if (codecs == 'mjpg') {
      type = shaka.util.ManifestParserUtils.ContentType.IMAGE;
    }

    // Check if the stream has already been created as part of another Variant
    // and return it if it has.
    if (this.uriToStreamInfosMap_.has(verbatimIFramePlaylistUri)) {
      return this.uriToStreamInfosMap_.get(verbatimIFramePlaylistUri);
    }

    const language = tag.getAttributeValue('LANGUAGE');
    const name = tag.getAttributeValue('NAME');

    const characteristics = tag.getAttributeValue('CHARACTERISTICS');

    const streamInfo = this.createStreamInfo_(
        this.globalId_++, [verbatimIFramePlaylistUri], codecs, type, language,
        /* primary= */ false, name, /* channelsCount= */ null,
        /* closedCaptions= */ null, characteristics, /* forced= */ false,
        /* sampleRate= */ null, /* spatialAudio= */ false);

    // Parse misc attributes.
    const resolution = tag.getAttributeValue('RESOLUTION');
    const [width, height] = resolution ? resolution.split('x') : [null, null];
    streamInfo.stream.width = Number(width) || undefined;
    streamInfo.stream.height = Number(height) || undefined;
    const bandwidth = tag.getAttributeValue('BANDWIDTH');
    if (bandwidth) {
      streamInfo.stream.bandwidth = Number(bandwidth);
    }

    this.uriToStreamInfosMap_.set(verbatimIFramePlaylistUri, streamInfo);
    return streamInfo;
  }
Parse EXT-X-I-FRAME-STREAM-INF media tag into a Stream object.

@param {shaka.hls.Tag} tag
@return {!shaka.hls.HlsParser.StreamInfo}
@private