Search in sources :

Example 6 with Descriptor

use of com.google.android.exoplayer2.source.dash.manifest.Descriptor in project ExoPlayer by google.

the class DashManifestParser method buildRepresentation.

protected Representation buildRepresentation(RepresentationInfo representationInfo, @Nullable String label, @Nullable String extraDrmSchemeType, ArrayList<SchemeData> extraDrmSchemeDatas, ArrayList<Descriptor> extraInbandEventStreams) {
    Format.Builder formatBuilder = representationInfo.format.buildUpon();
    if (label != null) {
        formatBuilder.setLabel(label);
    }
    @Nullable String drmSchemeType = representationInfo.drmSchemeType;
    if (drmSchemeType == null) {
        drmSchemeType = extraDrmSchemeType;
    }
    ArrayList<SchemeData> drmSchemeDatas = representationInfo.drmSchemeDatas;
    drmSchemeDatas.addAll(extraDrmSchemeDatas);
    if (!drmSchemeDatas.isEmpty()) {
        filterRedundantIncompleteSchemeDatas(drmSchemeDatas);
        formatBuilder.setDrmInitData(new DrmInitData(drmSchemeType, drmSchemeDatas));
    }
    ArrayList<Descriptor> inbandEventStreams = representationInfo.inbandEventStreams;
    inbandEventStreams.addAll(extraInbandEventStreams);
    return Representation.newInstance(representationInfo.revisionId, formatBuilder.build(), representationInfo.baseUrls, representationInfo.segmentBase, inbandEventStreams, representationInfo.essentialProperties, representationInfo.supplementalProperties, /* cacheKey= */
    null);
}
Also used : Format(com.google.android.exoplayer2.Format) DrmInitData(com.google.android.exoplayer2.drm.DrmInitData) SchemeData(com.google.android.exoplayer2.drm.DrmInitData.SchemeData) Nullable(androidx.annotation.Nullable)

Example 7 with Descriptor

use of com.google.android.exoplayer2.source.dash.manifest.Descriptor in project ExoPlayer by google.

the class DashManifestParser method parseRepresentation.

// Representation parsing.
protected RepresentationInfo parseRepresentation(XmlPullParser xpp, List<BaseUrl> parentBaseUrls, @Nullable String adaptationSetMimeType, @Nullable String adaptationSetCodecs, int adaptationSetWidth, int adaptationSetHeight, float adaptationSetFrameRate, int adaptationSetAudioChannels, int adaptationSetAudioSamplingRate, @Nullable String adaptationSetLanguage, List<Descriptor> adaptationSetRoleDescriptors, List<Descriptor> adaptationSetAccessibilityDescriptors, List<Descriptor> adaptationSetEssentialProperties, List<Descriptor> adaptationSetSupplementalProperties, @Nullable SegmentBase segmentBase, long periodStartUnixTimeMs, long periodDurationMs, long baseUrlAvailabilityTimeOffsetUs, long segmentBaseAvailabilityTimeOffsetUs, long timeShiftBufferDepthMs, boolean dvbProfileDeclared) throws XmlPullParserException, IOException {
    String id = xpp.getAttributeValue(null, "id");
    int bandwidth = parseInt(xpp, "bandwidth", Format.NO_VALUE);
    String mimeType = parseString(xpp, "mimeType", adaptationSetMimeType);
    String codecs = parseString(xpp, "codecs", adaptationSetCodecs);
    int width = parseInt(xpp, "width", adaptationSetWidth);
    int height = parseInt(xpp, "height", adaptationSetHeight);
    float frameRate = parseFrameRate(xpp, adaptationSetFrameRate);
    int audioChannels = adaptationSetAudioChannels;
    int audioSamplingRate = parseInt(xpp, "audioSamplingRate", adaptationSetAudioSamplingRate);
    String drmSchemeType = null;
    ArrayList<SchemeData> drmSchemeDatas = new ArrayList<>();
    ArrayList<Descriptor> inbandEventStreams = new ArrayList<>();
    ArrayList<Descriptor> essentialProperties = new ArrayList<>(adaptationSetEssentialProperties);
    ArrayList<Descriptor> supplementalProperties = new ArrayList<>(adaptationSetSupplementalProperties);
    ArrayList<BaseUrl> baseUrls = new ArrayList<>();
    boolean seenFirstBaseUrl = false;
    do {
        xpp.next();
        if (XmlPullParserUtil.isStartTag(xpp, "BaseURL")) {
            if (!seenFirstBaseUrl) {
                baseUrlAvailabilityTimeOffsetUs = parseAvailabilityTimeOffsetUs(xpp, baseUrlAvailabilityTimeOffsetUs);
                seenFirstBaseUrl = true;
            }
            baseUrls.addAll(parseBaseUrl(xpp, parentBaseUrls, dvbProfileDeclared));
        } else if (XmlPullParserUtil.isStartTag(xpp, "AudioChannelConfiguration")) {
            audioChannels = parseAudioChannelConfiguration(xpp);
        } else if (XmlPullParserUtil.isStartTag(xpp, "SegmentBase")) {
            segmentBase = parseSegmentBase(xpp, (SingleSegmentBase) segmentBase);
        } else if (XmlPullParserUtil.isStartTag(xpp, "SegmentList")) {
            segmentBaseAvailabilityTimeOffsetUs = parseAvailabilityTimeOffsetUs(xpp, segmentBaseAvailabilityTimeOffsetUs);
            segmentBase = parseSegmentList(xpp, (SegmentList) segmentBase, periodStartUnixTimeMs, periodDurationMs, baseUrlAvailabilityTimeOffsetUs, segmentBaseAvailabilityTimeOffsetUs, timeShiftBufferDepthMs);
        } else if (XmlPullParserUtil.isStartTag(xpp, "SegmentTemplate")) {
            segmentBaseAvailabilityTimeOffsetUs = parseAvailabilityTimeOffsetUs(xpp, segmentBaseAvailabilityTimeOffsetUs);
            segmentBase = parseSegmentTemplate(xpp, (SegmentTemplate) segmentBase, adaptationSetSupplementalProperties, periodStartUnixTimeMs, periodDurationMs, baseUrlAvailabilityTimeOffsetUs, segmentBaseAvailabilityTimeOffsetUs, timeShiftBufferDepthMs);
        } else if (XmlPullParserUtil.isStartTag(xpp, "ContentProtection")) {
            Pair<String, SchemeData> contentProtection = parseContentProtection(xpp);
            if (contentProtection.first != null) {
                drmSchemeType = contentProtection.first;
            }
            if (contentProtection.second != null) {
                drmSchemeDatas.add(contentProtection.second);
            }
        } else if (XmlPullParserUtil.isStartTag(xpp, "InbandEventStream")) {
            inbandEventStreams.add(parseDescriptor(xpp, "InbandEventStream"));
        } else if (XmlPullParserUtil.isStartTag(xpp, "EssentialProperty")) {
            essentialProperties.add(parseDescriptor(xpp, "EssentialProperty"));
        } else if (XmlPullParserUtil.isStartTag(xpp, "SupplementalProperty")) {
            supplementalProperties.add(parseDescriptor(xpp, "SupplementalProperty"));
        } else {
            maybeSkipTag(xpp);
        }
    } while (!XmlPullParserUtil.isEndTag(xpp, "Representation"));
    Format format = buildFormat(id, mimeType, width, height, frameRate, audioChannels, audioSamplingRate, bandwidth, adaptationSetLanguage, adaptationSetRoleDescriptors, adaptationSetAccessibilityDescriptors, codecs, essentialProperties, supplementalProperties);
    segmentBase = segmentBase != null ? segmentBase : new SingleSegmentBase();
    return new RepresentationInfo(format, !baseUrls.isEmpty() ? baseUrls : parentBaseUrls, segmentBase, drmSchemeType, drmSchemeDatas, inbandEventStreams, essentialProperties, supplementalProperties, Representation.REVISION_ID_DEFAULT);
}
Also used : SingleSegmentBase(com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase) ArrayList(java.util.ArrayList) SchemeData(com.google.android.exoplayer2.drm.DrmInitData.SchemeData) SegmentTemplate(com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate) Format(com.google.android.exoplayer2.Format) Pair(android.util.Pair)

Example 8 with Descriptor

use of com.google.android.exoplayer2.source.dash.manifest.Descriptor in project ExoPlayer by google.

the class DashMediaPeriod method getClosedCaptionTrackFormats.

private static Format[] getClosedCaptionTrackFormats(List<AdaptationSet> adaptationSets, int[] adaptationSetIndices) {
    for (int i : adaptationSetIndices) {
        AdaptationSet adaptationSet = adaptationSets.get(i);
        List<Descriptor> descriptors = adaptationSets.get(i).accessibilityDescriptors;
        for (int j = 0; j < descriptors.size(); j++) {
            Descriptor descriptor = descriptors.get(j);
            if ("urn:scte:dash:cc:cea-608:2015".equals(descriptor.schemeIdUri)) {
                Format cea608Format = new Format.Builder().setSampleMimeType(MimeTypes.APPLICATION_CEA608).setId(adaptationSet.id + ":cea608").build();
                return parseClosedCaptionDescriptor(descriptor, CEA608_SERVICE_DESCRIPTOR_REGEX, cea608Format);
            } else if ("urn:scte:dash:cc:cea-708:2015".equals(descriptor.schemeIdUri)) {
                Format cea708Format = new Format.Builder().setSampleMimeType(MimeTypes.APPLICATION_CEA708).setId(adaptationSet.id + ":cea708").build();
                return parseClosedCaptionDescriptor(descriptor, CEA708_SERVICE_DESCRIPTOR_REGEX, cea708Format);
            }
        }
    }
    return new Format[0];
}
Also used : Format(com.google.android.exoplayer2.Format) Descriptor(com.google.android.exoplayer2.source.dash.manifest.Descriptor) AdaptationSet(com.google.android.exoplayer2.source.dash.manifest.AdaptationSet)

Example 9 with Descriptor

use of com.google.android.exoplayer2.source.dash.manifest.Descriptor in project ExoPlayer by google.

the class DashMediaPeriodTest method adaptationSetSwitchingProperty_mergesTrackGroups.

@Test
public void adaptationSetSwitchingProperty_mergesTrackGroups() throws IOException {
    DashManifest manifest = parseManifest("media/mpd/sample_mpd_switching_property");
    DashMediaPeriod dashMediaPeriod = createDashMediaPeriod(manifest, 0);
    List<AdaptationSet> adaptationSets = manifest.getPeriod(0).adaptationSets;
    // We expect the three adaptation sets with the switch descriptor to be merged, retaining the
    // representations in their original order.
    TrackGroupArray expectedTrackGroups = new TrackGroupArray(new TrackGroup(/* id= */
    "0", adaptationSets.get(0).representations.get(0).format, adaptationSets.get(0).representations.get(1).format, adaptationSets.get(2).representations.get(0).format, adaptationSets.get(2).representations.get(1).format, adaptationSets.get(3).representations.get(0).format), new TrackGroup(/* id= */
    "3", adaptationSets.get(1).representations.get(0).format));
    MediaPeriodAsserts.assertTrackGroups(dashMediaPeriod, expectedTrackGroups);
}
Also used : TrackGroup(com.google.android.exoplayer2.source.TrackGroup) DashManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest) TrackGroupArray(com.google.android.exoplayer2.source.TrackGroupArray) AdaptationSet(com.google.android.exoplayer2.source.dash.manifest.AdaptationSet) Test(org.junit.Test)

Example 10 with Descriptor

use of com.google.android.exoplayer2.source.dash.manifest.Descriptor in project ExoPlayer by google.

the class AppInfoTableDecoder method parseAit.

@Nullable
private static Metadata parseAit(ParsableBitArray sectionData) {
    // tableId, section_syntax_indication, reserved_future_use, reserved
    sectionData.skipBits(12);
    int sectionLength = sectionData.readBits(12);
    int endOfSection = sectionData.getBytePosition() + sectionLength - 4;
    // test_application_flag, application_type, reserved, version_number, current_next_indicator,
    // section_number, last_section_number, reserved_future_use
    sectionData.skipBits(44);
    int commonDescriptorsLength = sectionData.readBits(12);
    // Since we currently only keep URL and control code, which are unique per application,
    // there is no useful information in common descriptor.
    sectionData.skipBytes(commonDescriptorsLength);
    // reserved_future_use, application_loop_length
    sectionData.skipBits(16);
    ArrayList<AppInfoTable> appInfoTables = new ArrayList<>();
    while (sectionData.getBytePosition() < endOfSection) {
        @Nullable String urlBase = null;
        @Nullable String urlExtension = null;
        // application_identifier
        sectionData.skipBits(48);
        int controlCode = sectionData.readBits(8);
        // reserved_future_use
        sectionData.skipBits(4);
        int applicationDescriptorsLoopLength = sectionData.readBits(12);
        int positionOfNextApplication = sectionData.getBytePosition() + applicationDescriptorsLoopLength;
        while (sectionData.getBytePosition() < positionOfNextApplication) {
            int descriptorTag = sectionData.readBits(8);
            int descriptorLength = sectionData.readBits(8);
            int positionOfNextDescriptor = sectionData.getBytePosition() + descriptorLength;
            if (descriptorTag == DESCRIPTOR_TRANSPORT_PROTOCOL) {
                // See section 5.3.6.
                int protocolId = sectionData.readBits(16);
                // label
                sectionData.skipBits(8);
                if (protocolId == TRANSPORT_PROTOCOL_HTTP) {
                    // See section 5.3.6.2.
                    while (sectionData.getBytePosition() < positionOfNextDescriptor) {
                        int urlBaseLength = sectionData.readBits(8);
                        urlBase = sectionData.readBytesAsString(urlBaseLength, Charsets.US_ASCII);
                        int extensionCount = sectionData.readBits(8);
                        for (int urlExtensionIndex = 0; urlExtensionIndex < extensionCount; urlExtensionIndex++) {
                            int urlExtensionLength = sectionData.readBits(8);
                            sectionData.skipBytes(urlExtensionLength);
                        }
                    }
                }
            } else if (descriptorTag == DESCRIPTOR_SIMPLE_APPLICATION_LOCATION) {
                // See section 5.3.7.
                urlExtension = sectionData.readBytesAsString(descriptorLength, Charsets.US_ASCII);
            }
            sectionData.setPosition(positionOfNextDescriptor * 8);
        }
        sectionData.setPosition(positionOfNextApplication * 8);
        if (urlBase != null && urlExtension != null) {
            appInfoTables.add(new AppInfoTable(controlCode, urlBase + urlExtension));
        }
    }
    return appInfoTables.isEmpty() ? null : new Metadata(appInfoTables);
}
Also used : ArrayList(java.util.ArrayList) Metadata(com.google.android.exoplayer2.metadata.Metadata) Nullable(androidx.annotation.Nullable) Nullable(androidx.annotation.Nullable)

Aggregations

Nullable (androidx.annotation.Nullable)6 Format (com.google.android.exoplayer2.Format)6 ArrayList (java.util.ArrayList)4 AdaptationSet (com.google.android.exoplayer2.source.dash.manifest.AdaptationSet)3 SchemeData (com.google.android.exoplayer2.drm.DrmInitData.SchemeData)2 Descriptor (com.google.android.exoplayer2.source.dash.manifest.Descriptor)2 SingleSegmentBase (com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase)2 ParsableByteArray (com.google.android.exoplayer2.util.ParsableByteArray)2 Pair (android.util.Pair)1 SparseArray (android.util.SparseArray)1 SparseIntArray (android.util.SparseIntArray)1 DrmInitData (com.google.android.exoplayer2.drm.DrmInitData)1 Metadata (com.google.android.exoplayer2.metadata.Metadata)1 TrackGroup (com.google.android.exoplayer2.source.TrackGroup)1 TrackGroupArray (com.google.android.exoplayer2.source.TrackGroupArray)1 DashManifest (com.google.android.exoplayer2.source.dash.manifest.DashManifest)1 SegmentTemplate (com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate)1 List (java.util.List)1 Matcher (java.util.regex.Matcher)1 Test (org.junit.Test)1