Included Use Cases

Introduction

The previous chapters have shown how Manifest Edit comes with a preinstalled Plugins Library and how these can be combined, by means of the Pipeline Configuration File, into pipelines.

We encourage users to think creatively about the possible different ways of combining plugins to realize specific functionalities they may need. However, we think it's very useful to provide a list of specific use cases that Unified Streaming has encountered and how they can be solved by Manifest Edit.

UTC Timing Removal

This use case is based on the utc_remove plugin.

In this use case, the UTCTiming element is removed from a LIVE manifest. This is not recommended in general: best practices for LIVE streaming recommend to keep this element. However, in this particular use case the involved players were unable to reach the specified time server, triggering security alerts. This use case helped reducing noise and false warnings in the network monitoring application.

- mpd:
  - manifest_edit.plugins.utc_remove:
      - '*'

You can find a similar configuration in the provided utc_add.yaml file available in the example folder.

UTC Timing Format/Server Change

This use case is based on the utc_remove plugin and utc_add plugin.

In this use case, the customer wanted to use its own implementation of a time server, using the NTP protocol and related time format. At this purpose, both the format and value of the UTCTiming element needs to be changed. This can be accomplished by first removing the original element, then adding one in the desired format.

- mpd:
  - manifest_edit.plugins.utc_remove:
      - '*'

  - manifest_edit.plugins.utc_add:
      ntp:
        https://myserver.mydomain/?ntp

You can find a similar configuration in the provided utc_change.yaml file available in the example folder.

Track Reordering

These use cases are based on the manifest_order plugin.

These use cases are all realized applying different configurations to the manifest_order plugin.

You can find other examples of similar configurations in the provided adaptation_sets_order.yaml, adaptation_sets_representations_order.yaml, representations_order.yaml files available in the example folder.

Set First Track

In this use case, a single Representation is selected from a "video" adaptation set and moved so it appears before all others. Specifically, this use case requires a track with a specific language to be the first.

- mpd:
  - manifest_edit.plugins.manifest_order:
      periods:
        - '*' : '.*'
          adaptation_sets:
              manualOrder:
                - lang: 'en'
                  contentType: 'video'

Order Tracks by language

In this use case, all adaptation sets are sorted by language, in ascending alphabetical order.

- mpd:
  - manifest_edit.plugins.manifest_order:
      periods:
        - '*' : '.*'
          adaptation_sets:
            orderBy :      "lang"
            orderCriteria: "asc"

Order Tracks in order of descending bitrate

In this use case, all adaptation sets are sorted by bandwidth, in descending order.

- mpd:
  - manifest_edit.plugins.manifest_order:
      periods:
        - '*' : '.*'
          adaptation_sets:
            orderBy :      "bandwidth"
            orderCriteria: "desc"

Low Latency

This use case is based on the supplemental_property_add plugin, the essential_property_add plugin and the service_description_add plugin.

In this use case, DASH Low Latency parameters are added to a manifest for players that support this functionality. This is achieved by adding a Service Description to the MPD element and Supplemental Properties to each adaptation set.

This use case replicates the DVB-DASH Low Latency Mode provided by the Origin.

- mpd:
  # This is an example of how you can combine multiple plugins in a
  #  multi-stage processing pipeline.
  - manifest_edit.plugins.supplemental_property_add:
      # Low Latency needs this Supplemental Property for every adaptations set
      periods:
        - '*' : '.*'
          adaptation_sets:
            - '*' : '.*'
              supplementalPropertyName : "urn:dvb:dash:lowlatency:critical:2019"
              supplementalPropertyValue: "true"

  - manifest_edit.plugins.service_description_add:
      # Low Latency requires to add a Service Description element to the
      #  mpd root. The "urn:dvb:dash:lowlatency:scope:2019" schemeIdUri is
      #  required. Latency and PlaybackRate are optional.
      - id: '1'
        Scope:
          - schemeIdUri: "urn:dvb:dash:lowlatency:scope:2019"
            # value: '' #optional
            # id: ''    #optional
        Latency:
          min: 1500
          max: 6000
          target: 3000
          #reference_id: 0 #optional
        PlaybackRate:
          - min: '0.5' # Etsi Real value, must be provided as strings
            max: '1.5' # Etsi Real value, must be provided as strings

If required, an Essential Property can be used instead of a Supplemental Property. In this case, the configuration would be the following:

- mpd:
  # This is an example of how you can combine multiple plugins in a
  #  multi-stage processing pipeline.
  - manifest_edit.plugins.essential_property_add:
      # Low Latency needs this Essential Property for every adaptations set
      periods:
        - '*' : '.*'
          adaptation_sets:
            - '*' : '.*'
              essentialPropertyName : "urn:dvb:dash:lowlatency:critical:2019"
              essentialPropertyValue: "true"

  - manifest_edit.plugins.service_description_add:
      # Low Latency requires to add a Service Description element to the
      #  mpd root. The "urn:dvb:dash:lowlatency:scope:2019" schemeIdUri is
      #  required. Latency and PlaybackRate are optional.
      - id: '1'
        Scope:
          - schemeIdUri: "urn:dvb:dash:lowlatency:scope:2019"
            # value: '' #optional
            # id: ''    #optional
        Latency:
          min: 1500
          max: 6000
          target: 3000
          #reference_id: 0 #optional
        PlaybackRate:
          - min: '0.5' # Etsi Real value, must be provided as strings
            max: '1.5' # Etsi Real value, must be provided as strings

You can find similar configurations in the provided low_latency.yaml and low_latency_with_essential_property.yaml files available in the example folder.

Adaptation Sets Switching

This use case is based on the supplemental_property_add plugin and the adaptation_sets_switching plugin.

In this use case, the customer wants to offer the same content with different encryption keys for different resolutions (HD and SD). The DASH implementation guidelines (Chapter 7) clearly states that in this case, two different adaptation sets must be created. This is the default behavior of Unified Origin.

For such scenarios, the separate adaptation sets can be added to a same Switching Set to enable seamless switching functionality in players supporting it.

The following example adds all the "video" adaptation sets of a manifest to the same Switching Set:

- mpd:
  - manifest_edit.plugins.adaptation_sets_switching:
      periods:
        - '*' : '.*'
          adaptation_sets:
            - contentType: 'video'
              switching_set: '1'
              destination: 'supplemental_property_add'

  - manifest_edit.plugins.supplemental_property_add:

You can find a similar configuration in the provided adaptation_sets_switching.yaml file available in the example folder.

Sidecar subtitles removal

This use case is based on the element_remove plugin.

The customer's toolchain may involve a third-party ad-insertion tool that does not support the presence of "sidecar" subtitles along with fragmented ones. The Origin's default behavior is instead to add by default such sidecar subtitles, which are carried in an adaptation set with contentType = 'text' and mimeType = 'text/vtt'. For such scenario, it is possible to remove with manifest-edit the unsupported adaptation set by means of the following configuration:

- mpd:
  - manifest_edit.plugins.element_remove:
      periods:
        - '*' : '.*'
          adaptation_sets:
            - contentType : 'text'
              mimeType: 'text/vtt'
              remove: 'this'

You can find a similar configuration in the provided adaptation_sets_removal.yaml and representations_removal.yaml files available in the example folder.