From ffcbe12c03286aaca35b1f249af573a7b811e26e Mon Sep 17 00:00:00 2001 From: "Jordi J. Gimenez" <87380947+jordijoangimenez@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:20:33 +0100 Subject: [PATCH] Complete migration from old wikis (#49) * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update _config.yml * Update _config.yml * Add files via upload * Rename 5g-mag-reference-tools.png.png to 5g-mag-reference-tools.png * Update _config.yml * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update 5G-Downlink-Media-Streaming-Projects.md * Rename 5G-Downlink-Media-Streaming-Projects.md to features.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update features.md * Update features.md * Update standards.md * Update _config.yml * Update _config.yml * Update index.md * Update index.md * Create quick-start-guide.md * Update quick-start-guide.md * Update quick-start-guide.md * Create docker-implementation.md * Create hardware-requirements.md * Update quick-start-guide.md * Update quick-start-guide.md * Create sample-files.md * Create guidelines-contributors.md * Update quick-start-guide.md * Update index.md * Update hardware-requirements.md * Update quick-start-guide.md * Update hardware-requirements.md * Update sample-files.md * Update quick-start-guide.md * Create Tutorial_1.md * Create Tutorial_1 * Create Tutorial_2 * Rename Tutorial_2 to Tutorial_2.md * Rename Tutorial_1 to Tutorial_1.md * Create Tutorial_3.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Delete pages/5g-media-streaming/standards.md * Create tutorials.md * Update tutorials.md * Update features.md * Update features.md * Update tutorials.md * Update Tutorial_1.md * Update features.md * Create specifications.md * Create projects.md * Create repositories.md * Update features.md * Update specifications.md * Update projects.md * Update repositories.md * Update tutorials.md * Update index.md * Update specifications.md * Update projects.md * Update repositories.md * Update tutorials.md * Update repositories.md * Update repositories.md * Update tutorials.md * Update tutorials.md * Update index.md * Update index.md * Update features.md * Update projects.md * Update specifications.md * Update tutorials.md * Update Tutorial_1.md * Update Tutorial_1.md * Create features.md * Update features.md * Create projects.md * Create repositories.md * Create specifications.md * Create tutorials.md * Update specifications.md * Update specifications.md * Create specifications.md * Create specifications.md * Create specifications.md * Create specifications.md * Create specifications.md * Create specifications.md * Update features.md * Create features.md * Update features.md * Create features.md * Create features.md * Create features.md * Create features.md * Create features.md * Update features.md * Update features.md * Update features.md * Update features.md * Update features.md * Update features.md * Update features.md * Update features.md * Update projects.md * Update repositories.md * Update tutorials.md * Update index.md * Update projects.md * Update repositories.md * Update repositories.md * Update repositories.md * Update tutorials.md * Update specifications.md * Create projects.md * Create repositories.md * Update tutorials.md * Create tutorials.md * Update index.md * Update specifications.md * Create projects.md * Create repositories.md * Create tutorials.md * Update index.md * Create projects.md * Create repositories.md * Update index.md * Create tutorials.md * Update specifications.md * Create projects.md * Create repositories.md * Create tutorials.md * Update Tutorial_1.md * Update Tutorial_2.md * Update Tutorial_3.md * Update quick-start-guide.md * Update sample-files.md * Update hardware-requirements.md * Update docker-implementation.md * Update quick-start-guide.md * Update sample-files.md * Update docker-implementation.md * Update Tutorial_1.md * Update Tutorial_2.md * Update Tutorial_3.md * Update index.md * Create projects.md * Create repositories.md * Create tutorials.md * Update index.md * Create repositories.md * Update repositories.md * Create projects.md * Create tutorials.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update index.md --- _config.yml | 6 +- assets/images/5g-mag-reference-tools.png | Bin 0 -> 95121 bytes index.md | 25 +- pages/5g-core-network-components/features.md | 9 + pages/5g-core-network-components/index.md | 28 +- pages/5g-core-network-components/projects.md | 11 + .../repositories.md | 15 + .../specifications.md | 8 + pages/5g-core-network-components/tutorials.md | 10 + pages/5g-media-streaming/Tutorial_1.md | 341 ++++++++++++++++++ ...edia-Streaming-Projects.md => features.md} | 51 +-- pages/5g-media-streaming/index.md | 65 +--- pages/5g-media-streaming/projects.md | 46 +++ pages/5g-media-streaming/repositories.md | 49 +++ pages/5g-media-streaming/specifications.md | 11 + pages/5g-media-streaming/standards.md | 17 - pages/5g-media-streaming/tutorials.md | 10 + .../features.md | 9 + .../5g-multicast-broadcast-services/index.md | 22 +- .../projects.md | 14 + .../repositories.md | 9 + .../specifications.md | 10 + .../tutorials.md | 11 + pages/ai-ml-evaluation-framework/features.md | 9 + pages/ai-ml-evaluation-framework/index.md | 25 +- pages/ai-ml-evaluation-framework/projects.md | 9 + .../repositories.md | 13 + .../specifications.md | 8 + pages/ai-ml-evaluation-framework/tutorials.md | 11 + pages/emergency-alerts/features.md | 9 + pages/emergency-alerts/index.md | 23 +- pages/emergency-alerts/projects.md | 13 + pages/emergency-alerts/repositories.md | 9 + pages/emergency-alerts/specifications.md | 8 + pages/emergency-alerts/tutorials.md | 11 + pages/guidelines-contributors.md | 104 ++++++ pages/lte-based-5g-broadcast/Tutorial_1.md | 200 ++++++++++ pages/lte-based-5g-broadcast/Tutorial_2.md | 176 +++++++++ pages/lte-based-5g-broadcast/Tutorial_3.md | 214 +++++++++++ .../docker-implementation.md | 105 ++++++ pages/lte-based-5g-broadcast/features.md | 9 + .../hardware-requirements.md | 94 +++++ pages/lte-based-5g-broadcast/index.md | 67 +--- pages/lte-based-5g-broadcast/projects.md | 25 ++ .../quick-start-guide.md | 258 +++++++++++++ pages/lte-based-5g-broadcast/repositories.md | 46 +++ pages/lte-based-5g-broadcast/sample-files.md | 59 +++ .../lte-based-5g-broadcast/specifications.md | 10 + pages/lte-based-5g-broadcast/tutorials.md | 11 + pages/multimedia-content-delivery/features.md | 9 + pages/multimedia-content-delivery/index.md | 30 +- pages/multimedia-content-delivery/projects.md | 16 + .../repositories.md | 18 + .../specifications.md | 9 + .../multimedia-content-delivery/tutorials.md | 11 + pages/xr-media-integration-in-5g/features.md | 9 + pages/xr-media-integration-in-5g/index.md | 42 +-- pages/xr-media-integration-in-5g/projects.md | 12 + .../repositories.md | 30 ++ .../specifications.md | 8 + pages/xr-media-integration-in-5g/tutorials.md | 11 + 61 files changed, 2169 insertions(+), 339 deletions(-) create mode 100644 assets/images/5g-mag-reference-tools.png create mode 100644 pages/5g-core-network-components/features.md create mode 100644 pages/5g-core-network-components/projects.md create mode 100644 pages/5g-core-network-components/repositories.md create mode 100644 pages/5g-core-network-components/specifications.md create mode 100644 pages/5g-core-network-components/tutorials.md create mode 100644 pages/5g-media-streaming/Tutorial_1.md rename pages/5g-media-streaming/{5G-Downlink-Media-Streaming-Projects.md => features.md} (81%) create mode 100644 pages/5g-media-streaming/projects.md create mode 100644 pages/5g-media-streaming/repositories.md create mode 100644 pages/5g-media-streaming/specifications.md delete mode 100644 pages/5g-media-streaming/standards.md create mode 100644 pages/5g-media-streaming/tutorials.md create mode 100644 pages/5g-multicast-broadcast-services/features.md create mode 100644 pages/5g-multicast-broadcast-services/projects.md create mode 100644 pages/5g-multicast-broadcast-services/repositories.md create mode 100644 pages/5g-multicast-broadcast-services/specifications.md create mode 100644 pages/5g-multicast-broadcast-services/tutorials.md create mode 100644 pages/ai-ml-evaluation-framework/features.md create mode 100644 pages/ai-ml-evaluation-framework/projects.md create mode 100644 pages/ai-ml-evaluation-framework/repositories.md create mode 100644 pages/ai-ml-evaluation-framework/specifications.md create mode 100644 pages/ai-ml-evaluation-framework/tutorials.md create mode 100644 pages/emergency-alerts/features.md create mode 100644 pages/emergency-alerts/projects.md create mode 100644 pages/emergency-alerts/repositories.md create mode 100644 pages/emergency-alerts/specifications.md create mode 100644 pages/emergency-alerts/tutorials.md create mode 100644 pages/guidelines-contributors.md create mode 100644 pages/lte-based-5g-broadcast/Tutorial_1.md create mode 100644 pages/lte-based-5g-broadcast/Tutorial_2.md create mode 100644 pages/lte-based-5g-broadcast/Tutorial_3.md create mode 100644 pages/lte-based-5g-broadcast/docker-implementation.md create mode 100644 pages/lte-based-5g-broadcast/features.md create mode 100644 pages/lte-based-5g-broadcast/hardware-requirements.md create mode 100644 pages/lte-based-5g-broadcast/projects.md create mode 100644 pages/lte-based-5g-broadcast/quick-start-guide.md create mode 100644 pages/lte-based-5g-broadcast/repositories.md create mode 100644 pages/lte-based-5g-broadcast/sample-files.md create mode 100644 pages/lte-based-5g-broadcast/specifications.md create mode 100644 pages/lte-based-5g-broadcast/tutorials.md create mode 100644 pages/multimedia-content-delivery/features.md create mode 100644 pages/multimedia-content-delivery/projects.md create mode 100644 pages/multimedia-content-delivery/repositories.md create mode 100644 pages/multimedia-content-delivery/specifications.md create mode 100644 pages/multimedia-content-delivery/tutorials.md create mode 100644 pages/xr-media-integration-in-5g/features.md create mode 100644 pages/xr-media-integration-in-5g/projects.md create mode 100644 pages/xr-media-integration-in-5g/repositories.md create mode 100644 pages/xr-media-integration-in-5g/specifications.md create mode 100644 pages/xr-media-integration-in-5g/tutorials.md diff --git a/_config.yml b/_config.yml index a8cfed32..4867bc23 100644 --- a/_config.yml +++ b/_config.yml @@ -26,11 +26,13 @@ baseurl: "" # the subpath of your site, e.g. /blog url: "" # the base hostname & protocol for your site, e.g. http://example.com twitter_username: dsilhavy github_username: dsilhavy -logo: "/assets/images/5g-mag-logo-with-text.png" +logo: "/assets/images/5g-mag-reference-tools.png" aux_links: "5G-MAG Reference Tools on GitHub": - - "//github.com/5G-MAG" + - "//github.com/5G-MAG/Getting-Started" + "5G-MAG Website": + - "https://www.5g-mag.com" # Build settings theme: just-the-docs diff --git a/assets/images/5g-mag-reference-tools.png b/assets/images/5g-mag-reference-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6257fef0dc8fc86ab53e1747cc1f8c0256f904 GIT binary patch literal 95121 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≻AO_=^*A< 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

sO-05UK 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 literal 0 HcmV?d00001 diff --git a/index.md b/index.md index 4ca72ffa..ed5e72de 100644 --- a/index.md +++ b/index.md @@ -2,12 +2,33 @@ layout: default title: Home nav_order: 0 +has_children: true --- -5g-mag +5g-mag # Overview This website serves as an umbrella for documentation, practical guidelines and examples of applications that can be -built with the software packages and also in combination with other platforms. +built with the software packages available as 5G-MAG Reference Tools and also in combination with other platforms. +A summary about what we do can be found below. + + + +## Practical information +The repositories related to the **5G-MAG REFERENCE TOOLS** are usually starting with **rt-**. Some repositories are also allocating dependencies and auxiliary tools. In the case of third party branches, you will find such repositories with its original name from source. + +For additional details about the 5G-MAG Reference Tools development programme please visit the following links: + +* Developer Space ([developer.5g-mag.com](https://developer.5g-mag.com/)). +* Meet the developer community, participate, contribute, join the public calls: [https://www.5g-mag.com/community](https://www.5g-mag.com/community) +* Learn about the License Model for contributors: [https://www.5g-mag.com/license](https://www.5g-mag.com/license) +* Download installation packages: [https://www.5g-mag.com/install](https://www.5g-mag.com/install) +* Request early access for private repositories: [https://www.5g-mag.com/early-access](https://www.5g-mag.com/early-access) +* Get additional resources for members: [https://www.5g-mag.com/extras](https://www.5g-mag.com/extras) + +## Join the open communities +* Join [Slack](https://5g-mag.slack.com/) for discussion +* Join the [Google Group](https://groups.google.com/g/5g-mag-reference-tools) mailing list +* If you have questions that cannot be shared publicly, reach out to us via email: [reference-tools@5g-mag.com](mailto:reference-tools@5g-mag.com) diff --git a/pages/5g-core-network-components/features.md b/pages/5g-core-network-components/features.md new file mode 100644 index 00000000..315660b2 --- /dev/null +++ b/pages/5g-core-network-components/features.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Features +parent: 5G Core Network Components +has_children: false +nav_order: 1 +--- + +# List of features under implementation diff --git a/pages/5g-core-network-components/index.md b/pages/5g-core-network-components/index.md index 1fa443cc..f1cae425 100644 --- a/pages/5g-core-network-components/index.md +++ b/pages/5g-core-network-components/index.md @@ -2,30 +2,8 @@ layout: default title: 5G Core Network Components has_children: true +nav_order: 2 --- - -# Implementing 5G Core Network components +# 5G Core Network components These are a series of implementations that may be used in combination with other systems. -*** -## 📑 Specifications and architecture -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#5gcore) -*** - -## 🚧 On-going projects -Check the [Projects](https://github.com/5G-MAG/Getting-Started/wiki/5G-Core-Network-Projects) under development for 5G Core Network components -*** - -## ▶️ Using the tools -Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) and check the wikis below for more information -* Developers are working on it... stay tuned for news. -*** - -## ⭐ Related repositories -* Check the Repositories relevant to 5G Core Network components: Code, releases, packages, dockers, guidelines,... -### UE Data Collection Application Function: [rt-5gc-data-collection-application-function](https://github.com/5G-MAG/rt-5gc-data-collection-application-function) - -### 5G Core Service Consumers: [rt-5gc-service-consumers](https://github.com/5G-MAG/rt-5gc-service-consumers) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gc-service-consumers#readme) -* [Guidelines, development and testing](https://github.com/5G-MAG/rt-5gc-service-consumers/wiki) -* [Releases](https://github.com/5G-MAG/rt-5gc-service-consumers/releases) -* [Projects](https://github.com/5G-MAG/rt-5gc-service-consumers/projects?query=is%3Aopen) + diff --git a/pages/5g-core-network-components/projects.md b/pages/5g-core-network-components/projects.md new file mode 100644 index 00000000..67065774 --- /dev/null +++ b/pages/5g-core-network-components/projects.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Projects +parent: 5G Core Network Components +has_children: false +nav_order: 2 +--- +# 🚧 Related projects +## 5GMS: Network Assistance and Dynamic Policies features +Addition of Network Assistance and Dynamic Policies features to the 5GMS components, including integration with the BSF and PCF via new, reusable service consumer libraries. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/11) diff --git a/pages/5g-core-network-components/repositories.md b/pages/5g-core-network-components/repositories.md new file mode 100644 index 00000000..eaafa27e --- /dev/null +++ b/pages/5g-core-network-components/repositories.md @@ -0,0 +1,15 @@ +--- +layout: default +title: Repositories +parent: 5G Core Network Components +has_children: false +nav_order: 3 +--- +# ⭐ Related repositories +## UE Data Collection Application Function: [rt-5gc-data-collection-application-function](https://github.com/5G-MAG/rt-5gc-data-collection-application-function) + +## 5G Core Service Consumers: [rt-5gc-service-consumers](https://github.com/5G-MAG/rt-5gc-service-consumers) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gc-service-consumers#readme) +* [Guidelines, development and testing](https://github.com/5G-MAG/rt-5gc-service-consumers/wiki) +* [Releases](https://github.com/5G-MAG/rt-5gc-service-consumers/releases) +* [Projects](https://github.com/5G-MAG/rt-5gc-service-consumers/projects?query=is%3Aopen) diff --git a/pages/5g-core-network-components/specifications.md b/pages/5g-core-network-components/specifications.md new file mode 100644 index 00000000..8e3066d8 --- /dev/null +++ b/pages/5g-core-network-components/specifications.md @@ -0,0 +1,8 @@ +--- +layout: default +title: Specifications +parent: 5G Core Network Components +has_children: false +nav_order: 0 +--- +# 📑 Specifications and relevant references diff --git a/pages/5g-core-network-components/tutorials.md b/pages/5g-core-network-components/tutorials.md new file mode 100644 index 00000000..3d969873 --- /dev/null +++ b/pages/5g-core-network-components/tutorials.md @@ -0,0 +1,10 @@ +--- +layout: default +title: Tutorials +parent: 5G Core Network Components +has_children: true +nav_order: 4 +--- +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. +* We are working on it... diff --git a/pages/5g-media-streaming/Tutorial_1.md b/pages/5g-media-streaming/Tutorial_1.md new file mode 100644 index 00000000..a3bf04a0 --- /dev/null +++ b/pages/5g-media-streaming/Tutorial_1.md @@ -0,0 +1,341 @@ +--- +layout: default +title: 5G MSd Basic End-to-End Setup +parent: Tutorials +grand_parent: 5G Downlink Media Streaming +has_children: false +nav_order: 0 +--- + +# Tutorial - 5G MSd: Basic End-to-End Setup +This guide describes how to setup and configure the 5G-MAG Reference Tools - 5G Downlink Media Streaming components to create an end to end setup as depicted in the illustration below. + +Bildschirm­foto 2023-04-06 um 09 35 46 + +# Versions +This guide requires the following versions: + +| Component | Minimum Version | +| ------------- | ------------- | +| Application Function | `1.3.0` | +| Application Server | `1.2.0` | +| 5GMSd Aware Application | `1.0.0` | +| Media Session Handler | `1.0.0` | +| Media Stream Handler | `1.0.0` | +| Common Android Library | `1.0.0` | + +# Server-side setup +In some cases, you might want to work with a reduced setup to develop new functionality on the client-side. For that reason, the server-side setup guide is divided into two sections the [Option 1: Common server-side setup](#option-1-common-server-side-setup) and [Option 2: Server-side development setup](#option-2-server-side-development-setup). + +## Option 1: Common server-side setup + +### 1. Installing the Application Function +The first component that we need to install is the **5GMSd Application Function (AF)**. The AF is a network function that forms part of the 5G Media Streaming framework as defined in TS 26.501. AF is a logical function which embodies control plane aspects such as provisioning, configuration, and reporting, among others. Such functions can be provisioned by the 5GMSd Application Provider using a RESTful HTTP-based API (M1d). Another RESTful HTTP-based configuration and reporting API (M5d) is exposed to 5GMSd Clients. + +The detailed installation guide for the AF can be found in the corresponding [Github repository](https://github.com/5G-MAG/rt-5gms-application-function). Note that for this tutorial we are following the [installation guide](https://github.com/5G-MAG/rt-5gms-application-function/wiki/Testing-as-a-Local-User#running) to run the AF as a local user. + +### 2. Installing the Application Server +Next, we need to install the **5GMSd Application Server (AS)**. The AS provides 5G Media Streaming services to a population of 5GMSd Clients. This logical function embodies the data plane aspects that deal with media content (for instance, a Content Delivery Network). The content is ingested (both HTTP push- or pull-based are supported) from 5GMSd Application Providers at reference point `M2d`. The content is distributed to 5GMSd Clients at reference point `M4d`, which supports standard pull-based content retrieval protocols (e.g. DASH). + +The detailed installation guide for the AS can be found in the corresponding [Github repository](https://github.com/5G-MAG/rt-5gms-application-server). + +### 3. Running the Application Server + +Now start the AS +```` +sudo 5gms-application-server +```` + +For additional options, refer to the [Wiki documentation](https://github.com/5G-MAG/rt-5gms-application-server/blob/main/docs/README.md#running-the-example-without-building). Pay attention to the port configuration of the AS as it requires root permission to run on the standard ports (80 & 443). + +### 4. Running the Application Function +Now that we installed the AF and the AS we can configure the AF. A detailed configuration guide is available in the [Wiki documentation](https://github.com/5G-MAG/rt-5gms-application-function/wiki/Configuring-the-Application-Function) of the AF. + +#### Configuration of the AF +For this demo, we will run AF and AS on the same machine. As we want to access the `ServiceAccessInformation` via the `M5d` interface from our Media Session Handler running on an Android device we need to slightly modify the configuration. The goal is to expose the `M5d` interface via the IP address of our machine but have it running on a different port to not interfere with the default port of the `M3`interface on the AS (`Port 7777`). + +1. Open `~/rt-5gms-application-function/install/etc/open5gs/msaf.yaml` +2. Find the settings for `msaf:m5` +3. Replace the `addr` field with `0.0.0.0` and choose a different `port`. For instance: +```` +msaf: + m5: + - addr: 0.0.0.0 + - port: 7778 +```` + + +#### Starting the AF + +As we installed the AF as a local user, we start it with the following command: +```` +~/rt-5gms-application-function/install/bin/open5gs-msafd +```` +#### Creating a content hosting configuration + +There is a guide on how to test the AS with the AF in the [AS Wiki](https://github.com/5G-MAG/rt-5gms-application-server/blob/main/docs/README.md#testing-with-the-application-function). We are following a slightly different approach as we use the `msaf-configuration` tool that ships with version `1.3.0` of the Application Function. The `msaf-configuration` tool creates a `provisioningSession` and a `contentHostingConfiguration` based on a JSON input file. Moreover, it automatically generates the required `M8` information for us that we will later need on the client-side. + +First we create a configuration file to be used by the `msaf-configuration` tool: + +```` +[af-sync] +m5_authority = : +#docroot = /var/cache/rt-5gms/as/docroots +#default_docroot = /usr/share/nginx/html +```` + +Replace `` with the IP address of your machine and `` with the port that the `M5` interface is running on. For instance: + +```` +[af-sync] +m5_authority = 192.168.178.55:7778 +#docroot = /var/cache/rt-5gms/as/docroots +#default_docroot = /usr/share/nginx/html +```` + +Place this file in `/etc/rt-5gms/af-sync.conf` + +Now we define a JSON file with the streams: + +````json +{ + "aspId": "5GMAG", + "appId": "5G-MAG_Reference_Tools", + "streams": { + "vod": { + "name": "BBC R&D Demo Streams", + "ingestURL": "https://rdmedia.bbc.co.uk/", + "distributionConfigurations": [ + {"domainNameAlias": ""} + ], + "consumptionReporting": { + "reportingInterval": 30, + "samplePercentage": 50.00, + "locationReporting": true, + "accessReporting": true + } + } + }, + "vodMedia": [ + { + "name": "VoD: Elephant's Dream", + "stream": "vod", + "entryPoints": [ + { + "relativePath": "elephants_dream/1/client_manifest-all.mpd", + "contentType": "application/dash+xml", + "profiles": ["urn:mpeg:dash:profile:isoff-live:2011"] + } + ] + }, + { + "name": "VoD: Big Buck Bunny", + "stream": "vod", + "entryPoints": [ + { + "relativePath": "bbb/2/client_manifest-common_init.mpd", + "contentType": "application/dash+xml", + "profiles": ["urn:mpeg:dash:profile:isoff-live:2011"] + } + ] + }, + { + "name": "VoD: Testcard", + "stream": "vod", + "entryPoints": [ + { + "relativePath": "testcard/vod/manifests/avc-full.mpd", + "contentType": "application/dash+xml", + "profiles": ["urn:mpeg:dash:profile:isoff-live:2011"] + }, + { + "relativePath": "testcard/vod/manifests/avc-full.m3u8", + "contentType": "application/x-mpegURL" + } + ] + } + ] +} +```` + +Again, replace `` with the IP address of your machine. + +Place this file in `/etc/rt-5gms/streams.json` + +Now execute the `msaf-configuration` tool: + +```` +sudo ~/rt-5gms-application-function/install/bin/msaf-configuration +```` + +You should see a message like this: +```` +INFO:__main__:Publishing M8 info to: /usr/share/nginx/html, /var/cache/rt-5gms/as/docroots/192.168.178.55 +```` + +You can check the response of the `m8` request by opening `http://localhost/m8.json` in your browser. It should look like this: + +```` +{ + "m5BaseUrl": "http://192.168.178.55:7778/3gpp-m5/v2/", + "serviceList": [ + { + "provisioningSessionId": "872a0eb2-e40a-41ed-bf2a-03b8343221a7", + "name": "VoD: Llama Drama", + "entryPoints": [ + { + "locator": "http://192.168.178.55/m4d/provisioning-session-872a0eb2-e40a-41ed-bf2a-03b8343221a7/634cd01c-6822-4630-8444-8dd6279f94c6/CaminandesLlamaDrama4K.ism/manifest(format=mpd-time-csf)", + "contentType": "application/dash+xml", + "profiles": [ + "urn:mpeg:dash:profile:isoff-live:2011" + ] + }, + { + "locator": "http://192.168.178.55/m4d/provisioning-session-872a0eb2-e40a-41ed-bf2a-03b8343221a7/634cd01c-6822-4630-8444-8dd6279f94c6/CaminandesLlamaDrama4K.ism/manifest(format=m3u8-aapl-v3)", + "contentType": "application/vnd.apple.mpegurl" + } + ] + } + ] +} +```` + +In our Android application we will use this endpoint later to derive the required information to populate our stream selection drowdown and to query the Application Function via `M5`. + +#### Optional: Creating a server certificate + +Optionally, you can now also [create server certificate](https://github.com/5G-MAG/rt-5gms-application-function/wiki/Testing-the-M1-Interface#server-certificates). For plain `http` based playback we can omit this step. + +#### Optional: Checking the M5 interface +The complete documentation on how to test the M5 interface for AF versions 1.2.0 and above can be found [here](https://github.com/5G-MAG/rt-5gms-application-function/wiki/Testing-the-M5-Interface-on-v1.2.0) + +What we will need on the client side later is the `ServiceAccessInformation`. This will be requested via `M5d` by our MediaSessionHandler. Since retrieving this information is done via a simple HTTP GET request, we can access the information directly in the browser. For that reason, call the following URL and replace `{provisioningSessionId}` with the corresponding value. For instance, + +* `http://${msaf.m5.addr}:${msaf.m5.port}/3gpp-m5/v2/service-access-information/${provisioningSessionId}` + +becomes + +* `http://192.168.178.55:7778/3gpp-m5/v2/service-access-information/a0b5a258-d5da-41ed-b62f-cdd2806778b0` + +The output should look like the following: + +```` +{ + "provisioningSessionId": "a0b5a258-d5da-41ed-b62f-cdd2806778b0", + "provisioningSessionType": "DOWNLINK", + "streamingAccess": { + "mediaPlayerEntry": "http://192.168.178.55/m4d/provisioning-session-a0b5a258-d5da-41ed-b62f-cdd2806778b0/BigBuckBunny_4s_onDemand_2014_05_09.mpd" + } +} +```` + +## Option 2: Server-side development setup +For development purposes, it can be useful to mock the functionality of the AF and the AS. For that reason, 5G-MAG provides a [simple static webserver](https://github.com/5G-MAG/rt-5gms-examples/tree/main/express-mock-af). The server basically contains two endpoints to query `M8` information and the corresponding `ServiceAccessInformation`. The assets that are linked on the webserver are pointing to third-party CDNs. However, it would also be possible to add media content to the webserver in the `public` folder and thereby simulate a local Application Server. + +### 1. Configure the webserver +Open `/express-mock-af/routes/m8.js` and adjust the `m5BaseUrl` to point to your machine. + +Install the dependencies: + +```` +cd express-mock-af +npm install +```` + +### 2. Starting the webserver + +Navigate to the root folder of the server and start it: + +```` +cd express-mock-af +npm start +```` + +# Client-side setup +Not that we have the server-side setup in place we can focus on the client side. We need to install four components (two libraries, two Android applications) for the end-to-end setup. + +## 1. Installing the 5GMSd Common Android Library +The [5GMSd Common Android Library](https://github.com/5G-MAG/rt-5gms-common-android-library) is an Android library that includes models and helper classes used within the different client-side Android applications such as the 5GMSd-Aware Application, 5GMSd Media Stream Handler and the 5GMSd Media Session Handler. + +The installation guide can be found in the [Readme](https://github.com/5G-MAG/rt-5gms-common-android-library#readme) of the project. Note that you need to publish the library to a local maven repository as described in the installation guide. + +## 2. Installing the 5GMSd Media Stream Handler +The [5GMSd Media Stream Handler](https://github.com/5G-MAG/rt-5gms-media-stream-handler) is an Android library that includes the [ExoPlayer](https://github.com/google/ExoPlayer) as a dependency. The 5GMSd Media Stream Handler implements an adapter around the ExoPlayer APIs to expose TS.26.512 M7d interface functionality. Moreover, a MediaSessionHandlerAdapter establishes a Messenger connection to the [Media Session Handler](https://github.com/5G-MAG/rt-5gms-media-session-handler). The 5GMSd Media Stream Handler is included as an Android library by 5GMSd Aware Application. + +The installation guide can be found in the [Readme](https://github.com/5G-MAG/rt-5gms-media-stream-handler#readme) of the project. Note that you need to publish the library to a local maven repository as described in the installation guide. + +## 3. Installing the 5GMSd Media Session Handler +The [5GMSd Media Session Handler](https://github.com/5G-MAG/rt-5gms-media-session-handler) is an Android application that implements functionality for 5G Media Streaming media session handling. It is implemented as an Android Messenger Service that communicates via Inter Process Communication (IPC) with other Android libraries and applications such as the Media Stream Handler and the 5GMSd Aware Application. + +The Media Session Handler communicates with the 5GMSd Application Function via interface M5 to establish and control the delivery of a streaming media session in the downlink direction. In addition, the Media Session Handler exposes APIs via M6 to the 5GMSd-Aware Application and to the Media Player (for downlink streaming). + +The installation guide can be found in the [Readme](https://github.com/5G-MAG/rt-5gms-media-session-handler#readme) of the project. + +## 4. Configuring and installing the 5GMSd-Aware Application +The 5GMSd-Aware Application is an Android application that serves as a reference implementation for 5GMSd. It uses the [Media Stream Handler](https://github.com/5G-MAG/rt-5gms-media-stream-handle) for playback and communication with the [Media Session Handler](https://github.com/5G-MAG/rt-5gms-media-session-handler). + +The 5GMSd Aware Application is an application in the UE, provided by the 5GMSd Application Provider, that contains the service logic of the 5GMSd application service, and interacts with other 5GMSd Client and Network functions via the interfaces and APIs defined in the 5GMSd architecture. + +### 4.a Common Configuration +The 5GMSd-Aware Application supports `m8` input via REST endpoints or local files. For that reason, a configuration file located in `app/src/main/assets/config.properties.xml` is used. It contains a list of the possible `m8` endpoints. Per default, a single 5G-MAG hosted endpoint is linked: + +```` + + + https://rt.5g-mag.com/ + +```` + +For our local AS and AF setup we only need to extend this list with the `M8` endpoint we created previously: + +```` + + + m8/config_local_af.json + http:/// + +```` + +Replace `` with the IP of the machine that is running the AF and the AS, for instance: +```` + + + m8/config_local_af.json + http://192.168.178.55/ + +```` + + +### 4.a Alternative: Development Configuration +If you are using the development web server instead of the common AF and AS installation, simply open `app/src/main/assets/config.properties.xml` and uncomment the following two lines. These two local `.json` files correspond to the default configuration on the static webserver. + +```` + + + m8/config_single_media.json + m8/config_multi_media.json + +```` + +Navigate to `app/src/main/assets/m8` and adjust the IP address of the `m5BaseUrl` in `config_single_media.json` and `config_multi_media.json` to point to your local webserver. + +As an alternative, you can also use the `M8` endpoint of the development web server. For that reason, uncomment the following line and replace the IP address with the IP address of your machine. + +```` + + + http://192.168.178.55:3003/m8/ + +```` + +### 4.b Installation +The installation guide for the 5GMSd-Aware Application can be found in the [Readme](https://github.com/5G-MAG/rt-5gms-application/tree/development/fivegmag_5GMSdAwareApplication) of the project. + + +## 5. Running the application +Now that we have performed all the required setup and configuration, we can finally start our client-side applications. Unlock your Android phone and start the `MediaSessionHandler` if it is not already running. Afterwards start the `5GMSd-Aware Application`. Select an `M8` entry from the dropdown and then select one of the available stream URLs. Next, click on _Start Playback_. The output should look like this: + +Bildschirm­foto 2023-04-26 um 09 43 13 + + + diff --git a/pages/5g-media-streaming/5G-Downlink-Media-Streaming-Projects.md b/pages/5g-media-streaming/features.md similarity index 81% rename from pages/5g-media-streaming/5G-Downlink-Media-Streaming-Projects.md rename to pages/5g-media-streaming/features.md index 211539f5..2b26f6f7 100644 --- a/pages/5g-media-streaming/5G-Downlink-Media-Streaming-Projects.md +++ b/pages/5g-media-streaming/features.md @@ -1,45 +1,12 @@ -This wiki contains the on-going projects and supported features for 5G Downlink Media Streaming. - -# On-going Projects - -## 5GMS: Basic Media stream handling (MVP#1) -The main objective for MVP#1 is to implement a starting point for 5G Media Streaming with DASH-based media streaming using 5GMS formats and protocols as the basis. This includes a basic Media Player talking to a simple 5GMS Application Server. -* [Kanban board](https://github.com/orgs/5G-MAG/projects/3) - -## 5GMS: Media session handling (MVP#2) -The 5GMSd Media Session Handler retrieves Service Access Information from a 5GMSd Application Function (5GMSd AF) via reference point M5d. -* [Kanban board](https://github.com/orgs/5G-MAG/projects/4) - -## 5GMS: M1d Provisioning -Implementation of 5GMSd Provisioning (M1d) APIs -* [Kanban board](https://github.com/orgs/5G-MAG/projects/8) - -## 5GMS: M3 Link (AF to AS RESTful OpenAPI) -Configuration of the 5GMS Application Server by the 5GMS Application Function via an RESTful OpenAPI interface. -* [Kanban board](https://github.com/orgs/5G-MAG/projects/6) - -## 5GMS: Network Assistance and Dynamic Policies features -Addition of Network Assistance and Dynamic Policies features to the 5GMS components, including integration with the BSF and PCF via new, reusable service consumer libraries. -* [Kanban board](https://github.com/orgs/5G-MAG/projects/11) - -## 5GMS: QoE metrics collection and reporting feature -Everything required for the provisioning of QoE metrics collection and reporting in the 5GMS AF as well as the collection of QoE by the 5GMS Client and the reporting of QoE metrics by the Media Session Handler to the 5GMS AF. -* [Kanban board](https://github.com/orgs/5G-MAG/projects/12) - -## 5GMS: Consumption collection and reporting feature -Everything required for the provisioning of media consumption collection and reporting in the 5GMS AF as well as the collection of consumption reports by the 5GMS Client and the reporting by the Media Session Handler to the 5GMS AF. -* [Kanban board](https://github.com/orgs/5G-MAG/projects/16) - -## 5GMS: TS 26.512 V17.5.0 uplift -* [Kanban board](https://github.com/orgs/5G-MAG/projects/18) - -## 5GMS: Cloud infrastructure -* [Kanban board](https://github.com/orgs/5G-MAG/projects/21) - -## 5GMS: DVB-I Service using 5G Media Streaming -* [Kanban board](https://github.com/orgs/5G-MAG/projects/23) - -# List of 5G Downlink Media Streaming Features +--- +layout: default +title: Features +parent: 5G Downlink Media Streaming +has_children: false +nav_order: 1 +--- + +# List of features under implementation The following describes the features of the Application Function that have been implemented, due to be implemented or not planned yet. diff --git a/pages/5g-media-streaming/index.md b/pages/5g-media-streaming/index.md index f220b4d8..2c69d25f 100644 --- a/pages/5g-media-streaming/index.md +++ b/pages/5g-media-streaming/index.md @@ -2,67 +2,8 @@ layout: default title: 5G Downlink Media Streaming has_children: true -toc: false +nav_order: 1 --- -# Implementing 5G Downlink Media Streaming (5GMSd) -Information about 5G Downlink Media Streaming can be found at www.5g-mag.com/streaming -*** -## 📑 Specifications and architecture -* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/5G-Downlink-Media-Streaming-Architecture-(5GMSd):-Relevant-Specifications) -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#media-streaming) -*** - -## 🚧 On-going projects -Check the [Projects](5G-Downlink-Media-Streaming-Projects) under development for 5GMSd -*** - -## ▶️ Using the tools -Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) and check the wikis below for more information -* [End to End Setup for 5G Downlink Media Streaming (Android)](https://github.com/5G-MAG/Getting-Started/wiki/Use-Case:-5G-Downlink-Media-Streaming-End-to-End-Setup) -*** - -## ⭐ Related repositories -* Check the Repositories relevant to 5GMSd: Code, releases, packages, dockers, guidelines,... - -Please note that 5G Media Streaming makes use of other generic 5G Core Network components: https://github.com/5G-MAG/Getting-Started/wiki/5G-Core-Network - -### 5GMSd Application Function: [rt-5gms-application-function](https://github.com/5G-MAG/rt-5gms-application-function) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-application-function#readme) -* [Guidelines, development and testing](https://github.com/5G-MAG/rt-5gms-application-function/wiki) -* [Releases](https://github.com/5G-MAG/rt-5gms-application-function/releases) -* [Projects](https://github.com/5G-MAG/rt-5gms-application-function/projects?query=is%3Aopen) - -### 5GMSd Application Server: [rt-5gms-application-server](https://github.com/5G-MAG/rt-5gms-application-server) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-application-server#readme) -* [Guidelines, development and testing](https://github.com/5G-MAG/rt-5gms-application-server/wiki) -* [Releases](https://github.com/5G-MAG/rt-5gms-application-server/releases) -* [Projects](https://github.com/5G-MAG/rt-5gms-application-server/projects?query=is%3Aopen) - -### 5GMSd Media Session Handler: [rt-5gms-media-session-handler](https://github.com/5G-MAG/rt-5gms-media-session-handler) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-media-session-handler#readme) -* [Releases](https://github.com/5G-MAG/rt-5gms-media-session-handler/releases) - -### 5GMSd Media Stream Handler: [rt-5gms-media-stream-handler](https://github.com/5G-MAG/rt-5gms-media-stream-handler) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-media-stream-handler#readme) -* [Releases](https://github.com/5G-MAG/rt-5gms-media-stream-handler/releases) -* [Packages](https://github.com/orgs/5G-MAG/packages?repo_name=rt-5gms-media-stream-handler) - -### 5GMSd-Aware Applications: [rt-5gms-application](https://github.com/5G-MAG/rt-5gms-application) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-application#readme) -* [Releases](https://github.com/5G-MAG/rt-5gms-application/releases) - -## Auxiliary repositories - -### 5GMSd Common Android Library: [rt-5gms-common-android-library](https://github.com/5G-MAG/rt-5gms-common-android-library) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-common-android-library#readme) -* [Releases](https://github.com/5G-MAG/rt-5gms-common-android-library/releases) -* [Packages](https://github.com/orgs/5G-MAG/packages?repo_name=rt-5gms-common-android-library) - -### 5GMSd Examples: [rt-5gms-examples](https://github.com/5G-MAG/rt-5gms-examples) -* [Information](https://github.com/5G-MAG/rt-5gms-examples#readme) -* [Releases](https://github.com/5G-MAG/rt-5gms-examples/releases) - -### Tools common to various projects: [rt-common-shared](https://github.com/5G-MAG/rt-common-shared) -* [Information](https://github.com/5G-MAG/rt-common-shared#readme) -*** +# 5G Downlink Media Streaming (5GMSd) + diff --git a/pages/5g-media-streaming/projects.md b/pages/5g-media-streaming/projects.md new file mode 100644 index 00000000..2518a640 --- /dev/null +++ b/pages/5g-media-streaming/projects.md @@ -0,0 +1,46 @@ +--- +layout: default +title: Projects +parent: 5G Downlink Media Streaming +has_children: false +nav_order: 2 +--- + +# 🚧 Related projects + +## 5GMS: Basic Media stream handling (MVP#1) +The main objective for MVP#1 is to implement a starting point for 5G Media Streaming with DASH-based media streaming using 5GMS formats and protocols as the basis. This includes a basic Media Player talking to a simple 5GMS Application Server. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/3) + +## 5GMS: Media session handling (MVP#2) +The 5GMSd Media Session Handler retrieves Service Access Information from a 5GMSd Application Function (5GMSd AF) via reference point M5d. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/4) + +## 5GMS: M1d Provisioning +Implementation of 5GMSd Provisioning (M1d) APIs +* [Kanban board](https://github.com/orgs/5G-MAG/projects/8) + +## 5GMS: M3 Link (AF to AS RESTful OpenAPI) +Configuration of the 5GMS Application Server by the 5GMS Application Function via an RESTful OpenAPI interface. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/6) + +## 5GMS: Network Assistance and Dynamic Policies features +Addition of Network Assistance and Dynamic Policies features to the 5GMS components, including integration with the BSF and PCF via new, reusable service consumer libraries. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/11) + +## 5GMS: QoE metrics collection and reporting feature +Everything required for the provisioning of QoE metrics collection and reporting in the 5GMS AF as well as the collection of QoE by the 5GMS Client and the reporting of QoE metrics by the Media Session Handler to the 5GMS AF. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/12) + +## 5GMS: Consumption collection and reporting feature +Everything required for the provisioning of media consumption collection and reporting in the 5GMS AF as well as the collection of consumption reports by the 5GMS Client and the reporting by the Media Session Handler to the 5GMS AF. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/16) + +## 5GMS: TS 26.512 V17.5.0 uplift +* [Kanban board](https://github.com/orgs/5G-MAG/projects/18) + +## 5GMS: Cloud infrastructure +* [Kanban board](https://github.com/orgs/5G-MAG/projects/21) + +## 5GMS: DVB-I Service using 5G Media Streaming +* [Kanban board](https://github.com/orgs/5G-MAG/projects/23) diff --git a/pages/5g-media-streaming/repositories.md b/pages/5g-media-streaming/repositories.md new file mode 100644 index 00000000..11ae8bf9 --- /dev/null +++ b/pages/5g-media-streaming/repositories.md @@ -0,0 +1,49 @@ +--- +layout: default +title: Repositories +parent: 5G Downlink Media Streaming +has_children: false +nav_order: 3 +--- + +# ⭐ Related repositories +Please note that 5G Media Streaming makes use of other generic [5G Core Network components](https://jordijoangimenez.github.io/Getting-Started/pages/5g-core-network-components/) + +## 5GMSd Application Function: [rt-5gms-application-function](https://github.com/5G-MAG/rt-5gms-application-function) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-application-function#readme) +* [Guidelines, development and testing](https://github.com/5G-MAG/rt-5gms-application-function/wiki) +* [Releases](https://github.com/5G-MAG/rt-5gms-application-function/releases) +* [Projects](https://github.com/5G-MAG/rt-5gms-application-function/projects?query=is%3Aopen) + +## 5GMSd Application Server: [rt-5gms-application-server](https://github.com/5G-MAG/rt-5gms-application-server) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-application-server#readme) +* [Guidelines, development and testing](https://github.com/5G-MAG/rt-5gms-application-server/wiki) +* [Releases](https://github.com/5G-MAG/rt-5gms-application-server/releases) +* [Projects](https://github.com/5G-MAG/rt-5gms-application-server/projects?query=is%3Aopen) + +## 5GMSd Media Session Handler: [rt-5gms-media-session-handler](https://github.com/5G-MAG/rt-5gms-media-session-handler) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-media-session-handler#readme) +* [Releases](https://github.com/5G-MAG/rt-5gms-media-session-handler/releases) + +## 5GMSd Media Stream Handler: [rt-5gms-media-stream-handler](https://github.com/5G-MAG/rt-5gms-media-stream-handler) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-media-stream-handler#readme) +* [Releases](https://github.com/5G-MAG/rt-5gms-media-stream-handler/releases) +* [Packages](https://github.com/orgs/5G-MAG/packages?repo_name=rt-5gms-media-stream-handler) + +## 5GMSd-Aware Applications: [rt-5gms-application](https://github.com/5G-MAG/rt-5gms-application) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-application#readme) +* [Releases](https://github.com/5G-MAG/rt-5gms-application/releases) + +# Auxiliary repositories + +## 5GMSd Common Android Library: [rt-5gms-common-android-library](https://github.com/5G-MAG/rt-5gms-common-android-library) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-5gms-common-android-library#readme) +* [Releases](https://github.com/5G-MAG/rt-5gms-common-android-library/releases) +* [Packages](https://github.com/orgs/5G-MAG/packages?repo_name=rt-5gms-common-android-library) + +## 5GMSd Examples: [rt-5gms-examples](https://github.com/5G-MAG/rt-5gms-examples) +* [Information](https://github.com/5G-MAG/rt-5gms-examples#readme) +* [Releases](https://github.com/5G-MAG/rt-5gms-examples/releases) + +## Tools common to various projects: [rt-common-shared](https://github.com/5G-MAG/rt-common-shared) +* [Information](https://github.com/5G-MAG/rt-common-shared#readme) diff --git a/pages/5g-media-streaming/specifications.md b/pages/5g-media-streaming/specifications.md new file mode 100644 index 00000000..787d2172 --- /dev/null +++ b/pages/5g-media-streaming/specifications.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Specifications +parent: 5G Downlink Media Streaming +has_children: false +nav_order: 0 +--- + +# 📑 Specifications and relevant references +* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/5G-Downlink-Media-Streaming-Architecture-(5GMSd):-Relevant-Specifications) +* A list of relevant 3GPP Work Items can be found at [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/5G-Downlink-Media-Streaming-Architecture-(5GMSd):-Relevant-Work-Items) diff --git a/pages/5g-media-streaming/standards.md b/pages/5g-media-streaming/standards.md deleted file mode 100644 index e95ad701..00000000 --- a/pages/5g-media-streaming/standards.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -title: 5GMS Standards -parent: 5G Downlink Media Streaming ---- - -# 5G Downlink Media Streaming Architecture (5GMSd): Relevant Specifications - -This is a list of specifications in the scope of 5G Downlink Media Streaming. - -## Main specifications -* [ETSI TS 126 501](https://portal.etsi.org/webapp/workprogram/Report_WorkItem.asp?WKI_ID=67203) - 5G Media Streaming ( - 5GMS): General description and architecture (3GPP TS 26.501 version 17.3.0 Release 17) -* [ETSI TS 126 512](https://portal.etsi.org/webapp/workprogram/Report_WorkItem.asp?WKI_ID=67679) - 5G Media Streaming ( - 5GMS): Protocols (3GPP TS 26.512 version 17.3.0 Release 17) - - diff --git a/pages/5g-media-streaming/tutorials.md b/pages/5g-media-streaming/tutorials.md new file mode 100644 index 00000000..24a9c219 --- /dev/null +++ b/pages/5g-media-streaming/tutorials.md @@ -0,0 +1,10 @@ +--- +layout: default +title: Tutorials +parent: 5G Downlink Media Streaming +has_children: true +nav_order: 4 +--- + +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. diff --git a/pages/5g-multicast-broadcast-services/features.md b/pages/5g-multicast-broadcast-services/features.md new file mode 100644 index 00000000..7e6f48db --- /dev/null +++ b/pages/5g-multicast-broadcast-services/features.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Features +parent: 5G Multicast Broadcast Services +has_children: false +nav_order: 1 +--- + +# List of features under implementation diff --git a/pages/5g-multicast-broadcast-services/index.md b/pages/5g-multicast-broadcast-services/index.md index 2c7c4d37..03e23aab 100644 --- a/pages/5g-multicast-broadcast-services/index.md +++ b/pages/5g-multicast-broadcast-services/index.md @@ -2,24 +2,8 @@ layout: default title: 5G Multicast Broadcast Services has_children: true +nav_order: 5 --- -# Implementing 5MBS: 5G Multicast and Broadcast Services -Information about 5G Multicast and Broadcast Services can be found at www.5g-mag.com/multicast-broadcast -*** -## 📑 Specifications and architecture -* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/5G-Multicast-Broadcast-Services-(5MBS):-Relevant-Specifications) -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#multicast-broadcast) -*** - -## 🚧 On-going projects -Check the [Projects](https://github.com/5G-MAG/Getting-Started/wiki/5G-Multicast-Broadcast-Services-Projects) under development for 5G Multicast and Broadcast Services -*** - -## ▶️ Using the tools -Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) and check the wikis below for more information -*Developers are working on it... stay tuned for news. -*** - -## ⭐ Related repositories -* Check the Repositories relevant to 5G Multicast and Broadcast Services: Code, releases, packages, dockers, guidelines,... +# 5G Multicast and Broadcast Services (5MBS) + diff --git a/pages/5g-multicast-broadcast-services/projects.md b/pages/5g-multicast-broadcast-services/projects.md new file mode 100644 index 00000000..e15d7d1e --- /dev/null +++ b/pages/5g-multicast-broadcast-services/projects.md @@ -0,0 +1,14 @@ +--- +layout: default +title: Projects +parent: 5G Multicast Broadcast Services +has_children: false +nav_order: 2 +--- + +# 🚧 Related projects + +## 5MBS: 5G Core functions + +Initial implementation of MB-SMF, MB-UPF, AMF and basic multicast support in the 5G Core +* [Kanban board](https://github.com/orgs/5G-MAG/projects/19) diff --git a/pages/5g-multicast-broadcast-services/repositories.md b/pages/5g-multicast-broadcast-services/repositories.md new file mode 100644 index 00000000..59a59cb2 --- /dev/null +++ b/pages/5g-multicast-broadcast-services/repositories.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Repositories +parent: 5G Multicast Broadcast Services +has_children: false +nav_order: 3 +--- + +# ⭐ Related repositories diff --git a/pages/5g-multicast-broadcast-services/specifications.md b/pages/5g-multicast-broadcast-services/specifications.md new file mode 100644 index 00000000..306c816c --- /dev/null +++ b/pages/5g-multicast-broadcast-services/specifications.md @@ -0,0 +1,10 @@ +--- +layout: default +title: Specifications +parent: 5G Multicast Broadcast Services +has_children: false +nav_order: 0 +--- +# 📑 Specifications and relevant references +* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/5G-Multicast-Broadcast-Services-(5MBS):-Relevant-Specifications) +* A list of relevant 3GPP Work Items can be found at [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/5G-Multicast-Broadcast-Services-(5MBS):-Relevant-Work-Items) diff --git a/pages/5g-multicast-broadcast-services/tutorials.md b/pages/5g-multicast-broadcast-services/tutorials.md new file mode 100644 index 00000000..3ed1d6ce --- /dev/null +++ b/pages/5g-multicast-broadcast-services/tutorials.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Tutorials +parent: 5G Multicast Broadcast Services +has_children: true +nav_order: 4 +--- + +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. +* We are working on it... diff --git a/pages/ai-ml-evaluation-framework/features.md b/pages/ai-ml-evaluation-framework/features.md new file mode 100644 index 00000000..05762443 --- /dev/null +++ b/pages/ai-ml-evaluation-framework/features.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Features +parent: AI / ML Evaluation Framework +has_children: false +nav_order: 1 +--- + +# List of features under implementation diff --git a/pages/ai-ml-evaluation-framework/index.md b/pages/ai-ml-evaluation-framework/index.md index 4b7e0d11..9790d527 100644 --- a/pages/ai-ml-evaluation-framework/index.md +++ b/pages/ai-ml-evaluation-framework/index.md @@ -2,27 +2,8 @@ layout: default title: AI / ML Evaluation Framework has_children: true +nav_order: 8 --- -# Implementing Artificial Intelligence and Machine Learning Evaluation Framework -TBC -*** -## 📑 Specifications and architecture -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#ai-ml-evaluation) -*** - -## 🚧 On-going projects -Check the [Projects](https://github.com/5G-MAG/Getting-Started/wiki/AI-ML-Evaluation-Framework-Projects) under development for Artificial Intelligence and Machine Learning -*** - -## ▶️ Using the tools -Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) and check the wikis below for more information -*Developers are working on it... stay tuned for news. -*** - -## ⭐ Related repositories -* Check the Repositories relevant to Artificial Intelligence and Machine Learning Evaluation Framework: Code, releases, packages, dockers, guidelines,... - Note that these repositories are currently private and under testing. Early access can be requested at: https://www.5g-mag.com/early-access - -### AI/ML Evaluation Framework: [rt-ai-ml-evaluation-framework](https://github.com/5G-MAG/rt-ai-ml-evaluation-framework) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-ai-ml-evaluation-framework#readme) +# Artificial Intelligence and Machine Learning Evaluation Framework + diff --git a/pages/ai-ml-evaluation-framework/projects.md b/pages/ai-ml-evaluation-framework/projects.md new file mode 100644 index 00000000..d674b907 --- /dev/null +++ b/pages/ai-ml-evaluation-framework/projects.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Projects +parent: AI / ML Evaluation Framework +has_children: false +nav_order: 2 +--- + +# 🚧 Related projects diff --git a/pages/ai-ml-evaluation-framework/repositories.md b/pages/ai-ml-evaluation-framework/repositories.md new file mode 100644 index 00000000..0ca5a0a3 --- /dev/null +++ b/pages/ai-ml-evaluation-framework/repositories.md @@ -0,0 +1,13 @@ +--- +layout: default +title: Repositories +parent: AI / ML Evaluation Framework +has_children: false +nav_order: 3 +--- + +# ⭐ Related repositories +Note that these repositories are currently private and under testing. Early access can be requested at: https://www.5g-mag.com/early-access + +## AI/ML Evaluation Framework: [rt-ai-ml-evaluation-framework](https://github.com/5G-MAG/rt-ai-ml-evaluation-framework) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-ai-ml-evaluation-framework#readme) diff --git a/pages/ai-ml-evaluation-framework/specifications.md b/pages/ai-ml-evaluation-framework/specifications.md new file mode 100644 index 00000000..5e112160 --- /dev/null +++ b/pages/ai-ml-evaluation-framework/specifications.md @@ -0,0 +1,8 @@ +--- +layout: default +title: Specifications +parent: AI / ML Evaluation Framework +has_children: false +nav_order: 0 +--- +# 📑 Specifications and relevant references diff --git a/pages/ai-ml-evaluation-framework/tutorials.md b/pages/ai-ml-evaluation-framework/tutorials.md new file mode 100644 index 00000000..569573e4 --- /dev/null +++ b/pages/ai-ml-evaluation-framework/tutorials.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Tutorials +parent: AI / ML Evaluation Framework +has_children: true +nav_order: 4 +--- + +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. +* We are working on it... diff --git a/pages/emergency-alerts/features.md b/pages/emergency-alerts/features.md new file mode 100644 index 00000000..31f24598 --- /dev/null +++ b/pages/emergency-alerts/features.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Features +parent: Emergency Alerts over 5G Broadcast +has_children: false +nav_order: 1 +--- + +# List of features under implementation diff --git a/pages/emergency-alerts/index.md b/pages/emergency-alerts/index.md index c11335ee..e1154147 100644 --- a/pages/emergency-alerts/index.md +++ b/pages/emergency-alerts/index.md @@ -1,24 +1,9 @@ --- layout: default -title: Emergency Alerts +title: Emergency Alerts over 5G Broadcast has_children: true +nav_order: 6 --- -# Implementing Emergency Alerts over 5G Broadcast -Information about LTE-based 5G Broadcast can be found at www.5g-mag.com/5gbroadcast -*** -## 📑 Specifications and architecture -* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/MBMS-&-LTE-based-5G-Broadcast:-Relevant-Specifications) -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#emergency5gbroadcast) -*** - -## 🚧 On-going projects -Check the [Projects](Emergency-Alerts-5G-Broadcast-Projects) under development for Emergency Alerts over 5G Broadcast -*** - -## ▶️ Using the tools -* Developers are working on it... stay tuned for news. -*** - -## ⭐ Related repositories -* Check the Repositories relevant to MBMS & LTE-based 5G Broadcast: Code, releases, packages, dockers, guidelines,... +# Emergency Alerts over 5G Broadcast + diff --git a/pages/emergency-alerts/projects.md b/pages/emergency-alerts/projects.md new file mode 100644 index 00000000..03f8fb94 --- /dev/null +++ b/pages/emergency-alerts/projects.md @@ -0,0 +1,13 @@ +--- +layout: default +title: Projects +parent: Emergency Alerts over 5G Broadcast +has_children: false +nav_order: 2 +--- + +# 🚧 Related projects + +## MBMS: Public Warning System +Issues and required functionality around support for a Public Warning System as defined in ETSI 103 720. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/20) diff --git a/pages/emergency-alerts/repositories.md b/pages/emergency-alerts/repositories.md new file mode 100644 index 00000000..4f622e8e --- /dev/null +++ b/pages/emergency-alerts/repositories.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Repositories +parent: Emergency Alerts over 5G Broadcast +has_children: false +nav_order: 3 +--- + +# ⭐ Related repositories diff --git a/pages/emergency-alerts/specifications.md b/pages/emergency-alerts/specifications.md new file mode 100644 index 00000000..aac0e553 --- /dev/null +++ b/pages/emergency-alerts/specifications.md @@ -0,0 +1,8 @@ +--- +layout: default +title: Specifications +parent: Emergency Alerts over 5G Broadcast +has_children: false +nav_order: 0 +--- +# 📑 Specifications and relevant references diff --git a/pages/emergency-alerts/tutorials.md b/pages/emergency-alerts/tutorials.md new file mode 100644 index 00000000..305b6736 --- /dev/null +++ b/pages/emergency-alerts/tutorials.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Tutorials +parent: Emergency Alerts over 5G Broadcast +has_children: true +nav_order: 4 +--- + +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. +* We are working on it... diff --git a/pages/guidelines-contributors.md b/pages/guidelines-contributors.md new file mode 100644 index 00000000..2555b8d2 --- /dev/null +++ b/pages/guidelines-contributors.md @@ -0,0 +1,104 @@ +--- +layout: default +title: Guidelines for Contributors +parent: Home +--- + +# Guidelines for Contributors + +If you wish to contribute code to the projects then you will first need **sign the Contributor License Agreement (CLA)**. Only +individuals and/or companies with a signed CLA can contribute code. Please visit and for more details and to download the CLA form. + +## Raising Issues + +Anyone can raise issues against projects, you do not need to have signed the Contributor License Agreement (CLA) to do so. + + +## Releases + +### Release Process + +**TODO: Details of the release process** +- Tagging for release candidates +- Period of RC testing (see [Testing release candidates](#testing-release-candidates)) +- If there are blocking issues + - Fix blockers + - Create new release candidate +- ... otherwise + - Package up the release + - Announce the release on Slack and Google Groups + +### Testing release candidates + +**TODO: How releases are tested** + +## Git Branching strategy +We are using a slightly modified version of Gitflow as a branching model. A detailed introduction to Gitflow can be found [here](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow). + +#### Main branch +The _main_ branch stores the official release history. The current version of the _main_ branch always stores the latest release. + +#### Development branch +The _development_ branch serves as the integration branch for new feature and bugfix branches. It reflects the latest stable changes in the current development cycle. + +#### Feature branches +Each new feature is implemented in a separate _feature_ branch. Feature branches use _development_ as their parent branch. When a feature is completed the respective branch gets merged back into development. + +A feature branch is created the following way: +```` +git checkout development +git checkout -b feature/newfeature +```` + +#### Release branches +Once the _development_ branch has acquired enough features and bugfixes for a release, a release candidate branch is created based on the current version of the _development_ branch. For details on the release procedure please refer to the [release procedure](https://github.com/Dash-Industry-Forum/DASH-IF-Conformance/wiki/Release-Procedure) documentation. + +The release candidate always includes a version number and is created in the following way: + +```` +git checkout develop +git checkout -b RC-1.2.0 +```` + +Once a release candidate is approved the respective branch is merged into the _main_ branch. + +#### Bugfix branches +Similar to _feature_ branches, the _bugfix_ branches are created directly from _development_. In contrast to hotfixes, bugfixes are not considered criticial and do not require a fast new release. _Bugfix_ branches are created the following way: + +```` +git checkout development +git checkout -b bugfix/newbugfix +```` + +#### Hotfix branches +_Hotfix_ branches are used to quickly patch production releases in case of critical errors. _Hotfix_ branches are created directly from _main_ and merged back into _main_ and _development_ as soon as they are completed. Once the hotfix is applied a new release shall be created. + +```` +git checkout main +git checkout -b hotfix/newhotfix +```` + +#### Cloning a repository with a specific branch +It is also possible to clone a repository and specify the target branch directly: + +`git clone -b ` + +## Forking the project +To work on a new feature or a bugfix you first need to fork the repository that you want to work on. A detailed guide how to fork a repository can be found [here](https://docs.github.com/en/get-started/quickstart/fork-a-repo). + +## Pull requests +Once a feature or a hotfix branch is completed a new pull request against the _development_ (in case of _feature_ branches) or the _main_ branch (in case of _hotfix_ branches) is created: + +1. Navigate to the list of available branches. Depending on the concrete setup the new branch is available directly on the main repository or on your fork of the main repository. + +Bildschirmfoto 2022-03-22 um 14 30 29 + +2. Click on "New pull request" +Bildschirmfoto 2022-03-22 um 14 38 22 + +3. Select the target (base) branch: + * For `feature` branches select the `development` branch + * For `hotfix` branches select the `main` branch +4. Provide a summary of your changes in the textfield +5. Click on "Create pull request" + diff --git a/pages/lte-based-5g-broadcast/Tutorial_1.md b/pages/lte-based-5g-broadcast/Tutorial_1.md new file mode 100644 index 00000000..2405e428 --- /dev/null +++ b/pages/lte-based-5g-broadcast/Tutorial_1.md @@ -0,0 +1,200 @@ +--- +layout: default +title: HLS playback over 5G Broadcast +parent: Tutorials +grand_parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 4 +--- + +# Tutorial - HLS playback over 5G Broadcast + +## Introduction + +The goal of this documentation is to provide a use-case oriented information, i.e., the required steps to setup the 5G-MAG Reference Tools to playback a HLS video which was received via 5G Broadcast [1] can be viewed by using the 5G-MAG Reference Tools. The final outcome is also illustrated in a short demo video that can be found [here](https://github.com/5G-MAG/Documentation-and-Architecture#5g-mag-reference-tools---demo-video---overview). + +## Background + +### HTTP Live Streaming (HLS) + +HTTP Live Streaming (HLS) is an HTTP-based adaptive bitrate streaming communications protocol developed by +Apple Inc. and released in 2009 [2]. +HLS is based on master and media playlists (m3u8 files). The master playlist links to media playlists with the media +playlists describing the content. HLS is mainly used on Apple platforms due to native support. HLS typically uses the +Transport Stream (TS) media container, but also offers support for f-mp4/CMAF. + +More information can be found in the IETF HLS specification: + +* [RFC 8216 - HTTP Live Streaming](https://datatracker.ietf.org/doc/html/rfc8216) + +### Multimedia Broadcast/Multicast Service (MBMS) + +MBMS is a point-to-multipoint service in which data is transmitted from a single source entity to multiple recipients. +The MBMS bearer service offers two modes, namely broadcast mode and multicast mode. This use-case focus on the broadcast reception mode (5G Broadcast). + +More information about MBMS and the related interfaces and components can be found in the corresponding 3GPP and ETSI +specifications: + +* [23.246 - Multimedia Broadcast/Multicast Service (MBMS); Architecture and functional description(Release 16)](https://www.3gpp.org/ftp/Specs/archive/23_series/23.246/) +* [26.347 - Multimedia Broadcast/Multicast Service (MBMS); Application Programming Interface and URL (Release 16)](https://www.3gpp.org/ftp/Specs/archive/26_series/26.347/) +* [26.346 - Multimedia Broadcast/Multicast Service (MBMS); Protocols and codecs(Release 16)](https://www.3gpp.org/ftp/Specs/archive/26_series/26.346) +* [29.116 - Representational state transfer over xMB reference point between content provider and BM-SC](https://www.3gpp.org/ftp/Specs/archive/29_series/29.116) +* [ETSI TS 123 246 - Multimedia Broadcast/Multicast Service (MBMS); Architecture and functional description ](https://www.etsi.org/deliver/etsi_ts/123200_123299/123246/) + +### 5G-MAG Reference Tools + +Detailed information about the architecture of the 5G-MAG Reference Tools and how the MBMS broadcast mode is implemented can +be found on the Wiki pages of the different projects: + +* [MBMS Modem](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Modem) +* [MBMS Middleware](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Middleware) +* [Webinterface](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Webinterface) + +## Requirements + +In order to be able to play an HLS video which is received by 5G Broadcast, we need to install and run the following components of the 5G-MAG Reference Tools (make sure you have the suggested [hardware](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Hardware-Requirements#hardware-requirements) and [OS](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Hardware-Requirements#os) ready): + + +| Component | Required/Optional | Min version | Description | +| ------------- | ------------- | ------------- | ------------- | +| [MBMS Modem](https://github.com/5G-MAG/rt-mbms-modem) | Required | v1.1.1 | The MBMS Modem builds the lower part of the 5G-MAG Reference Tools. Its main task is to convert a 5G BC input signal (received either as live I/Q raw data from the SDR or as prerecorded SDR sample file) to multicast IP packets on the output. The MBMS Modem can run as background process or can be started/stopped manually. | +| [MBMS Middleware](https://github.com/5G-MAG/rt-mbms-mw) | Required | v0.9.1 | The MBMS Middleware presents the heart of the 5G-MAG Reference Tools. Its main task is to provide the best available content to the (internal or external) application at any time. If available, it combines content from (mobile) broadband, WiFi with the 5G broadcast content from the MBMS Modem using an advanced decision logic. The content is presented to the applications in the form of an intelligent edge cache ready for pickup via http(s). Internally, the MBMS Middleware uses the [5G-MAG Reference Tools FLUTE library](https://github.com/5G-MAG/rt-libflute) to decode FLUTE encoded manifest files and media segments. | +| [RT Webinterace](https://github.com/5G-MAG/rt-wui)| Optional | v0.0.10 | The 5G-MAG Reference Tools WebUserInterface (rt-wui)provides an optional graphical webinterface with a control display for each 5G-MAG Reference Tools process (MBMS Modem, MBMS Middleware). Its main purpose is to collect and display useful information from the MBMS Modem and the MBMS Middleware. The webinterface provides basic browser-based HLS playback of the HLS manifest and segments provided by the MBMS Middlware using [hls.js](https://github.com/video-dev/hls.js/). | +| [HLS sample recording](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Sample-Files#hls-payload) | Optional (setup requires either a sample recoding or a an SDR) | / | In order to support application developers as well as 5G-MAG contributors for testing their improvements, ORS captured sample files ("raw data" = digitized I/Q data at LimeSDR Mini output) directly from a 5G BC transmitter. +| Software Defined Radio (SDR) | Optional (setup requires either a sample recoding or a an SDR) | / | In case you are able to receive 5G Broadcast live signals, you need a Software Defined Radio (SDR) to convert the radio signal to an digitized I/Q data to feed the MBMS modem. A list of working SDRs can be found [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Hardware-Requirements#supported-sdr) + + +## Basic workflow + +As described in [Requirements](#Requirements) we need the MBMS Modem, the MBMS Middleware and a media player in order to +enable playback of HLS content in broadcast mode using the 5G-MAG Reference Tools. The basic interaction and output of +these components is illustrated in the Figure below: + +![Architecture](https://github.com/5G-MAG/Documentation-and-Architecture/blob/main/media/architecture/5G-MAG%20RT%20Architecture%20simplified.drawio.png) + +The output of the SDR or the sample file serves as the input for the MBMS Modem. The MBMS Modem converts the input data +to a UDP multicast. The UDP multicast serves as the input for the MBMS Middleware. The FLUTE encoded content is decoded +in the MBMS Middleware using the [5G-MAG Reference Tools FLUTE library](https://github.com/5G-MAG/rt-libflute). Once the +manifest files and media segments are FLUTE decoded they are cached in the middleware and made available to the media +player via an Nginx proxy. The media player itself is not aware that the content is provided via broadcast. + +Note that in +the illustration the media player is depicted as a separate component and not part of the web interface. + +## Installation + +Detailed installation instructions can be found in the respective Wiki documentation of the different projects. In order +to enable HLS playback via MBMS the following steps are required: + +1. [Install the MBMS Modem](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Modem#Installation) +2. [Install the MBMS Middleware](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Middleware#Installation) +3. [Install the Webinterface](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Webinterface#Installation) +4. [Download an HLS sample file](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Sample-Files) or setup an HLS live stream on your transmitting infrastructure + +## Running the components + +Once all the required components have been installed, we need to sequentially start all of them. Depending on the +concrete use case (either a live SDR input or a prerecorded sample file) the concrete calls are slightly different. + +### Using a prerecorded sample file +This Section provides information on how to run the 5G-MAG Reference Tools using a prerecorded HLS sample file. + +#### MBMS Modem +1. Follow the detailed instructions on how to configure multicast routing provided [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#run-the-mbms-modem). +2. Stop and start the MBMS Modem as a service in order to generate or update the required configurations files. Note that this step might be required again after a reboot. + - `systemctl stop 5gmag-rt-modem` + - `systemctl start 5gmag-rt-modem` +3. Since we don't want to run the MBMS Modem as a service in the background but instead provide a prerecorded sample file, we need to make sure that the service is not running. Calling `systemctl stop 5g-mag-rt-modem` stops the service. +4. Start the MBMS Modem with a sample as specified [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#run-a-sample-file). It is important to provide the right bandwidth to the MBMS Modem. Consequently, for a 5 MHz bandwidth sample file, the command looks like this: `./modem -f "PathToSample/samplefile.raw" -b 5`. + +The final output on the terminal should now look like similar to the output below: +```` +modem[7891]: 5g-mag-rt modem v1.1.1 starting up +modem[7891]: Initialising SDR +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Raising main thread to realtime scheduling priority 20 +modem[7891]: GPS data stream started +modem[7891]: TUN file descriptor 6 +modem[7891]: Starting RESTful API handler at http://0.0.0.0:3010/modem-api/ +modem[7891]: Phy: PSS/SSS detected: Mode FDD, PCI 333, CFO 0.18315084 KHz, CP Extended +modem[7891]: Phy: MIB Decoded. Mode FDD, PCI 333, PRB 25, Ports 1, CFO 0.18315084 KHz, SFN 0 +modem[7891]: Decoded MIB at target sample rate, TTI is 120. Subframe synchronized. +modem[7891]: CINR 16.13 dB +modem[7891]: PDSCH: MCS 5, BLER 0.0, BER 0.0 +modem[7891]: MCCH: MCS 2, BLER 0.0, BER 0.0 +modem[7891]: MCH 0: MCS 16, BLER 0.0, BER 0.05661512027491409 +modem[7891]: MTCH 0: LCID 1, TMGI 0x00000009f165, 238.1.1.95:40085 +modem[7891]: MTCH 1: LCID 2, TMGI 0x00001009f165, 238.1.1.111:40101 +modem[7891]: ----- +```` + +#### MBMS Middleware +Now that the MBMS Modem is running and exposes the FLUTE encoded content via UDP multicast to the MBMS Middleware we can start the latter as well. The MBMS Middleware listens to the local tun interface. Received multicast packets from the Receive Process are FLUTE decoded and the files are stored in the cache. + +In this example, we start the MBMS Middleware right from the build folder. That way potential debug output is directly logged to the terminal. + +Note: Depending on the format of the Service Announcement file you need to adjust the configuration in `/etc/5gmag-rt.conf`. Detailed information can be found [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Service-Announcement-Files). + +1. Navigate to the build folder of the MBMS Middleware, for instance: `cd /home/user/rt-mbms-mw/build` +2. Start the middleware: `./mw` + +The output should look like this: + +```` +mw[6611]: 5g-mag-rt mw v0.9.0 starting up +```` + + +#### Webinterface + +For the purpose of this documentation we use the Webinterface to monitor the MBMS Modem and the MBMS Middleware. Moreover, we use the hls.js integration in the Webinterface to playback the final HLS stream. In order run the Webinterface perform the steps describe [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Webinterface#run-the-webinterface). + +The Webinterface can also be started directly from its root folder: +1. cd `/home/user/rt-wui` +2. `node app.js` + +### Using an SDR card + +Todo + +## Playback +The final playback is similar for both use cases _"Using an SDR card"_ and _"Using a prerecorded sample file"_. + +### Webinterface +In order to use the webinterface for playback perform the following steps: + +1. Navigate to `http://localhost` in your browser +2. Click `Middleware v.0.9.1` on the top right corner +3. Click on the play button below the stream information +4. An instance of hls.js is initialized playing the HLS stream + +The output for step 3 and step 4 should look similar to this: + + + + + +### VLC +It is also possible to use other players like VLC. Simply paste the url to the `index.m3u8` into the VLC player. As an example the URL can look the following: `http://localhost/f/00001009f165/index.m3u8`. Replace the `localhost` part with the IP of the machine that is running the MBMS Middleware in order to access the stream from other machines in the same network. + + +## Troubleshooting + +### I/O errors in the MBMS Modem +If you encounter I/O errors in the MBMS Modem there are a few things to try: + +1. Verify that the correct network interface is used to output the UDP multicast. See https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#multicast-routing +2. Make sure to start/stop the MBMS Modem as a service before launching it from the `build` folder: + - `systemctl start 5g-mag-rt-modem` + - `systemctl stop 5g-mag-rt-modem` +3. Try starting the MBMS Modem with sudo rights: `sudo ./modem -f "PathToSample/samplefile.raw" -b 5 + + +## References + +[1] [LTE-based 5G Terrestrial Broadcast](https://github.com/5G-MAG/Documentation-and-Architecture#lte-based-5g-terrestrial-broadcast)
+[2] [https://en.wikipedia.org/wiki/HTTP_Live_Streaming](https://en.wikipedia.org/wiki/HTTP_Live_Streaming) diff --git a/pages/lte-based-5g-broadcast/Tutorial_2.md b/pages/lte-based-5g-broadcast/Tutorial_2.md new file mode 100644 index 00000000..56d23c50 --- /dev/null +++ b/pages/lte-based-5g-broadcast/Tutorial_2.md @@ -0,0 +1,176 @@ +--- +layout: default +title: RTP Playback over 5G Broadcast +parent: Tutorials +grand_parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 5 +--- + +# Tutorial - RTP Playback over 5G Broadcast + +## Introduction + +The goal of this documentation is to provide a use-case oriented information, i.e., the required steps to setup the 5G-MAG Reference Tools to use an RTP stream which was received via 5G Broadcast [1], processed by the [MBMS Modem](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Modem) and played in a third-party media player such as ffplay or VLC. + +## Background + +### Real-Time Transport Protocol (RTP) +The Real-Time Transport Protocol (RTP) is a network protocol for delivering audio and video data via unicast or multicast over IP-based networks. + +More information can be found in the IETF RTP specification: + +* [RTP: A Transport Protocol for Real-Time Applications](https://datatracker.ietf.org/doc/html/rfc3550) + +### Multimedia Broadcast/Multicast Service (MBMS) + +MBMS is a point-to-multipoint service in which data is transmitted from a single source entity to multiple recipients. +The MBMS bearer service offers two modes, namely broadcast mode and multicast mode. This use-case focus on the broadcast reception mode (5G Broadcast). + +More information about MBMS and the related interfaces and components can be found in the corresponding 3GPP and ETSI +specifications: + +* [23.246 - Multimedia Broadcast/Multicast Service (MBMS); Architecture and functional description(Release 16)](https://www.3gpp.org/ftp/Specs/archive/23_series/23.246/) +* [26.347 - Multimedia Broadcast/Multicast Service (MBMS); Application Programming Interface and URL (Release 16)](https://www.3gpp.org/ftp/Specs/archive/26_series/26.347/) +* [26.346 - Multimedia Broadcast/Multicast Service (MBMS); Protocols and codecs(Release 16)](https://www.3gpp.org/ftp/Specs/archive/26_series/26.346) +* [29.116 - Representational state transfer over xMB reference point between content provider and BM-SC](https://www.3gpp.org/ftp/Specs/archive/29_series/29.116) +* [ETSI TS 123 246 - Multimedia Broadcast/Multicast Service (MBMS); Architecture and functional description ](https://www.etsi.org/deliver/etsi_ts/123200_123299/123246/) + +### 5G-MAG Reference Tools + +Detailed information about the architecture of the 5G-MAG Reference Tools and how the MBMS broadcast mode is implemented can +be found on the Wiki pages of the different projects: + +* [MBMS Modem](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Modem) +* [Webinterface](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Webinterface) + +## Requirements + +In order to be able to play an RTP stream which is received by 5G Broadcast, we need to install and run the following components of the 5G-MAG Reference Tools (make sure you have the suggested [hardware](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Hardware-Requirements#hardware-requirements) and [OS](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Hardware-Requirements#os) ready): + + +| Component | Required/Optional | Min version | Description | +| ------------- | ------------- | ------------- | ------------- | +| [MBMS Modem](https://github.com/5G-MAG/rt-mbms-modem) | Required | v1.1.1 | The MBMS Modem builds the lower part of the 5G-MAG Reference Tools. Its main task is to convert a 5G BC input signal (received either as live I/Q raw data from the SDR or as prerecorded SDR sample file) to multicast IP packets on the output. The MBMS Modem can run as a background process or can be started/stopped manually. | +| [RTP sample recording](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Sample-Files#rtp-payload) | Optional (setup requires either a sample recording or a SDR) | / | In order to support application developers as well as 5G-MAG contributors for testing their improvements, ORS captured sample files ("raw data" = digitized I/Q data at LimeSDR Mini output) directly from a 5G BC transmitter. +| Software Defined Radio (SDR) | Optional (setup requires either a sample recoding or a SDR) | / | In case you are able to receive 5G Broadcast live signals, you need a Software Defined Radio (SDR) to convert the radio signal to a digitized I/Q data to feed the MBMS modem. A list of working SDRs can be found [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Hardware-Requirements#supported-sdr) +| Video Player | Required | / | For playback of the UDP multicast that is exposed by the MBMS modem we need a player that can handle UDP multicast inputs. As part of this tutorial, we will demonstrate playback in the [VLC Media Player](https://www.videolan.org/vlc/) and [ffplay](https://ffmpeg.org/download.html) + + +## Basic workflow + +As described in [Requirements](#Requirements) we need the MBMS Modem, the MBMS Middleware and a media player in order to +enable playback of HLS content in broadcast mode using the 5G-MAG Reference Tools. The basic interaction and output of +these components are illustrated in the Figure below: + +![Architecture](https://github.com/5G-MAG/Documentation-and-Architecture/blob/main/media/architecture/5G-MAG%20RT%20Architecture%20RTP%20example.drawio.png) + +The output of the SDR or the sample file serves as the input for the MBMS Modem. The MBMS Modem converts the input data +to a UDP multicast. The UDP multicast can be played directly in ffplay or VLC. + +## Installation + +Detailed installation instructions can be found in the respective Wiki documentation of the different projects. In order +to enable RTP playback via MBMS the following steps are required: + +1. [Install the MBMS Modem](https://github.com/5G-MAG/rt-mbms-modem#readme) +2. Install at least one of the following media players: + - [Install VLC](https://www.videolan.org/vlc/#download) + - [Install ffplay](https://linuxize.com/post/how-to-install-ffmpeg-on-ubuntu-20-04/) +3. [Download an RTP sample file](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Sample-Files#rtp-payload) or setup an RTP live stream on your transmitting infrastructure. + +## Running the components + +Once all the required components have been installed, we need to sequentially start all of them. Depending on the +concrete use case (either a live SDR input or a prerecorded sample file) the concrete calls are slightly different. + +### Using a prerecorded sample file +This Section provides information on how to run the 5G-MAG Reference Tools using a prerecorded HLS sample file. + +#### MBMS Modem +1. Follow the detailed instructions on how to configure multicast routing provided [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#run-the-mbms-modem). +2. Stop and start the MBMS Modem as a service in order to generate or update the required configurations files. Note that this step might be required again after a reboot. + - `systemctl stop 5gmag-rt-modem` + - `systemctl start 5gmag-rt-modem` +3. Since we don't want to run the MBMS Modem as a service in the background but instead provide a prerecorded sample file, we need to make sure that the service is not running. Calling `systemctl stop 5g-mag-rt-modem` stops the service. +4. Start the MBMS Modem with a sample as specified [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#run-a-sample-file). It is important to provide the right bandwidth to the MBMS Modem. Consequently, for a 5 MHz bandwidth sample file, the command looks like this: `sudo ./modem -f "PathToSample/5MHz_MCS16_1kHz25_RTP_3.5.raw" -b 5`. + +The final output on the terminal should now look similar to the output below: +```` +modem[10498]: Phy: PSS/SSS detected: Mode FDD, PCI 333, CFO 0.20108362 KHz, CP Extended +modem[10498]: Phy: MIB Decoded. Mode FDD, PCI 333, PRB 25, Ports 1, CFO 0.20108362 KHz, SFN 528 +modem[10498]: Decoded MIB at target sample rate, TTI is 5360. Subframe synchronized. +modem[10498]: CINR 20.82 dB +modem[10498]: PDSCH: MCS 5, BLER 0.0, BER 0.0 +modem[10498]: MCCH: MCS 2, BLER 0.0, BER 0.0 +modem[10498]: MCH 0: MCS 16, BLER 0.0, BER 0.05661512027491409 +modem[10498]: MTCH 0: LCID 1, TMGI 0x00000309f165, 238.1.1.95:40085 +modem[10498]: MTCH 1: LCID 2, TMGI 0x00001009f165, 239.11.4.10:5520 +modem[10498]: ----- +modem[10498]: CINR 18.12 dB +modem[10498]: PDSCH: MCS 5, BLER 0.0, BER 0.0 +modem[10498]: MCCH: MCS 2, BLER 0.0, BER 0.0 +modem[10498]: MCH 0: MCS 16, BLER 0.0, BER 0.04579037800687285 +modem[10498]: MTCH 0: LCID 1, TMGI 0x00000309f165, 238.1.1.95:40085 +modem[10498]: MTCH 1: LCID 2, TMGI 0x00001009f165, 239.11.4.10:5520 +modem[10498]: ----- +```` + +### Using an SDR card + +Todo + +## Playback +The final playback is similar for both use cases _"Using an SDR card"_ and _"Using a prerecorded sample file"_. + +### Playback url +To identify the correct multicast address for playback, navigate to the terminal in which the modem process is running and check the log output. Next to the `TMGI` information, the multicast addresses are listed: + +```` +modem[10498]: CINR 20.38 dB +modem[10498]: PDSCH: MCS 5, BLER 0.0, BER 0.0 +modem[10498]: MCCH: MCS 2, BLER 0.0, BER 0.0 +modem[10498]: MCH 0: MCS 16, BLER 0.0, BER 0.0468213058419244 +modem[10498]: MTCH 0: LCID 1, TMGI 0x00000309f165, **238.1.1.95:40085** +modem[10498]: MTCH 1: LCID 2, TMGI 0x00001009f165, **239.11.4.10:5520** +modem[10498]: ----- +```` +In this case, we see two addresses, `238.1.1.95:40085` and `239.11.4.10:5520`. + +### ffplay +To play the stream in ffplay run the following steps + +1. Open a new terminal +2. Start ffplay specifying the address to the multicast stream: `ffplay udp://239.11.4.10:5520` + +The output should look like this: + + + +### VLC +It is also possible to use VLC for playback: + +1. Open VLC +2. Navigate to `Media > Open Network Stream` +3. Enter the stream url `rtp://@239.11.4.10:5520` +4. Press play + +The output should look like this: + + + +## Troubleshooting + +### I/O errors in the MBMS Modem +If you encounter I/O errors in the MBMS Modem, there are a few things to try: + +1. Verify that the correct network interface is used to output the UDP multicast. See https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#multicast-routing +2. Make sure to start/stop the MBMS Modem as a service before launching it from the `build` folder: + - `systemctl start 5g-mag-rt-modem` + - `systemctl stop 5g-mag-rt-modem` +3. Try starting the MBMS Modem with sudo rights: `sudo ./modem -f "PathToSample/samplefile.raw" -b 5 + + +## References + +[1] [LTE-based 5G Terrestrial Broadcast](https://github.com/5G-MAG/Documentation-and-Architecture#lte-based-5g-terrestrial-broadcast)
diff --git a/pages/lte-based-5g-broadcast/Tutorial_3.md b/pages/lte-based-5g-broadcast/Tutorial_3.md new file mode 100644 index 00000000..a07ec2ab --- /dev/null +++ b/pages/lte-based-5g-broadcast/Tutorial_3.md @@ -0,0 +1,214 @@ +--- +layout: default +title: Seamless switching +parent: Tutorials +grand_parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 6 +--- + +# Tutorial - Seamless switching +## Introduction + +The goal of this documentation is to provide detailed information, the required steps and the resulting output by the 5G-MAG Reference Tools for seamless switching between content delivered via broadcast and via unicast. Note: By the time this documentation is written the 5G-MAG Reference Tools support a dynamic switch for content packaged in the HLS format. The support DASH content is work in progres. The final outcome is also illustrated in a short demo video that can be found [here](https://www.youtube.com/watch?v=Jbir8B-gC4c). + + +## Background + +### HTTP Live Streaming (HLS) + +HTTP Live Streaming (HLS) is an HTTP-based adaptive bitrate streaming communications protocol developed by +Apple Inc. and released in 2009 [1]. +HLS is based on master and media playlists (m3u8 files). The master playlist links to media playlists with the media +playlists describing the content. HLS is mainly used on Apple platforms due to native support. HLS typically uses the +Transport Stream (TS) media container, but also offers support for f-mp4/CMAF. + +More information can be found in the IETF HLS specification: + +* [RFC 8216 - HTTP Live Streaming](https://datatracker.ietf.org/doc/html/rfc8216) + +### Unicast Delivery +Unicast delivery typically refers to delivery of media segments and manifest files using a one-to-one connection between the client and the Content Delivery Network (CDN). In contrast to the delivery of media files via multicast and broadcast each client is requesting and receiving the files individually. Classic DASH and HLS based unicast streaming is often referred to as Over-the-Top (OTT) streaming. + +### Multimedia Broadcast/Multicast Service (MBMS) + +MBMS is a point-to-multipoint service in which data is transmitted from a single source entity to multiple recipients. +The MBMS bearer service offers two modes, namely broadcast mode and multicast mode. In the scope of the 5G-MAG Reference +Tools we focus on the broadcast mode. + +More information about MBMS and the related interfaces and components can be found in the corresponding 3GPP and ETSI +specifications: + +* [23.246 - Multimedia Broadcast/Multicast Service (MBMS); Architecture and functional description(Release 16)](https://www.3gpp.org/ftp/Specs/archive/23_series/23.246/) +* [26.347 - Multimedia Broadcast/Multicast Service (MBMS); Application Programming Interface and URL (Release 16)](https://www.3gpp.org/ftp/Specs/archive/26_series/26.347/) +* [26.346 - Multimedia Broadcast/Multicast Service (MBMS); Protocols and codecs(Release 16)](https://www.3gpp.org/ftp/Specs/archive/26_series/26.346) +* [29.116 - Representational state transfer over xMB reference point between content provider and BM-SC](https://www.3gpp.org/ftp/Specs/archive/29_series/29.116) +* [ETSI TS 123 246 - Multimedia Broadcast/Multicast Service (MBMS); Architecture and functional description ](https://www.etsi.org/deliver/etsi_ts/123200_123299/123246/) + +### 5G-MAG Reference Tools + +Detailed information about the architecture of the 5G-MAG Reference Tools can be found on the Wiki pages of the different projects: + +* [MBMS Modem](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Modem) +* [MBMS Middleware](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Middleware) +* [Webinterface](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Webinterface) + +## Requirements + +In order to enable dynamic with the 5G-MAG Reference Tools, we need to install and run the following components of the +5G-MAG Reference Tools: + +* [MBMS Modem](https://github.com/5G-MAG/rt-mbms-modem) (**required, minimum version tbd**): The MBMS Modem builds the lower part of the 5G-MAG + Reference Tools. Its main task is to convert a 5G BC input signal (received either as live I/Q raw data from the SDR + or as prerecorded SDR sample file) to multicast IP packets on the output. The MBMS Modem can run as background process + or can be started/stopped manually. +* [MBMS Middleware](https://github.com/5G-MAG/rt-mbms-mw) (**required, minimum version tbd**): The MBMS Middleware presents the heart of the + 5G-MAG Reference Tools. Its main task is to provide the best available content to the (internal or external) + application at any time. If available, it combines content from (mobile) broadband, WiFi with the 5G broadcast content + from the MBMS Modem using an advanced decision logic. The content is presented to the applications in the form of an + intelligent edge cache ready for pickup via http(s). Internally, the MBMS Middleware uses + the [5G-MAG Reference Tools FLUTE library](https://github.com/5G-MAG/rt-libflute) to decode FLUTE encoded manifest + files and media segments. +* [RT Webinterace](https://github.com/5G-MAG/rt-wui) (optional): The 5G-MAG Reference Tools Webinterface (rt-wui) + provides an optional graphical webinterface with a control display for each 5G-MAG Reference Tools process (MBMS + Modem, MBMS Middleware). Its main purpose is to collect and display useful information from the MBMS Modem and the + MBMS Middleware. The webinterface provides basic browser-based HLS playback of the HLS manifest and segments provided + by the MBMS Middleare using [hls.js](https://github.com/video-dev/hls.js/). +* [HLS sample recording](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Sample-Files#hls-payload) (optional): In + order to support application developers as well as 5G-MAG contributors for testing their improvements, ORS captured + sample files ("raw data" = digitized I/Q data at LimeSDR Mini output) directly from a 5G BC transmitter. + +## Basic workflow + +As described in [Requirements](#Requirements) we need the MBMS Modem, the MBMS Middleware and a media player in order to +enable playback of HLS content in unicast and broadcast mode using the 5G-MAG Reference Tools. The basic interaction and output of +these components is illustrated in the Figure below: + +![Architecture](https://github.com/5G-MAG/Documentation-and-Architecture/blob/main/media/architecture/5G-MAG%20RT%20Architecture%20Seamless%20Switching%20v8.drawio.png) + +The output of the SDR or the sample file serves as the input for the MBMS Modem. The MBMS Modem converts the input data +to a UDP multicast. The UDP multicast serves as the input for the MBMS Middleware. The FLUTE encoded content is decoded +in the MBMS Middleware using the [5G-MAG Reference Tools FLUTE library](https://github.com/5G-MAG/rt-libflute). Once the +manifest files and media segments are FLUTE decoded they are cached in the middleware and made available to the media +player via an Nginx proxy. + +TBD: Unicast part + +The media player itself is not aware that the content is provided via broadcast. + +Note that in the illustration the media player is depicted as a separate component and not part of the web interface. + +## Installation + +Detailed installation instructions can be found in the respective Wiki documentation of the different projects. In order +to enable HLS playback via MBMS the following steps are required: + +1. [Install the MBMS Modem (minimum version tbd)](https://github.com/5G-MAG/rt-mbms-modem#readme) +2. [Install the MBMS Middleware (minimum version tbd)](https://github.com/5G-MAG/rt-mbms-mw#readme) +3. [Install the Webinterface](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Webinterface#installation) +4. [Download an HLS sample file](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Sample-Files) + +## Running the components + +Once all the required components have been installed, we need to sequentially start all of them. Depending on the +concrete use case (either a live SDR input or a prerecorded sample file) the concrete calls are slightly different. + +### Using a prerecorded sample file +This Section provides information on how to run the 5G-MAG Reference Tools using a prerecorded HLS sample file. + +#### MBMS Modem +1. Follow the detailed instructions on how to configure multicast routing provided [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#run-the-mbms-modem). +2. Stop and start the MBMS Modem as a service in order to generate or update the required configurations files. Note that this step might be required again after a reboot. + - `systemctl stop 5g-mag-rt-modem` + - `systemctl start 5g-mag-rt-modem` +3. Since we don't want to run the MBMS Modem as a service in the background but instead provide a prerecorded sample file, we need to make sure that the service is not running. Calling `systemctl stop 5g-mag-rt-modem` stops the service. +4. Start the MBMS Modem with a sample as specified [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#run-a-sample-file). It is important to provide the right bandwidth to the MBMS Modem. Consequently, for a 5 MHz bandwidth sample file, the command looks like this: `./modem -f "PathToSample/samplefile.raw" -b 5`. + +The final output on the terminal should now look like similar to the output below: +```` +modem[7891]: 5g-mag-rt modem v1.1.1 starting up +modem[7891]: Initialising SDR +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Launching phy thread with realtime scheduling priority 10 +modem[7891]: Raising main thread to realtime scheduling priority 20 +modem[7891]: GPS data stream started +modem[7891]: TUN file descriptor 6 +modem[7891]: Starting RESTful API handler at http://0.0.0.0:3010/modem-api/ +modem[7891]: Phy: PSS/SSS detected: Mode FDD, PCI 333, CFO 0.18315084 KHz, CP Extended +modem[7891]: Phy: MIB Decoded. Mode FDD, PCI 333, PRB 25, Ports 1, CFO 0.18315084 KHz, SFN 0 +modem[7891]: Decoded MIB at target sample rate, TTI is 120. Subframe synchronized. +modem[7891]: CINR 16.13 dB +modem[7891]: PDSCH: MCS 5, BLER 0.0, BER 0.0 +modem[7891]: MCCH: MCS 2, BLER 0.0, BER 0.0 +modem[7891]: MCH 0: MCS 16, BLER 0.0, BER 0.05661512027491409 +modem[7891]: MTCH 0: LCID 1, TMGI 0x00000009f165, 238.1.1.95:40085 +modem[7891]: MTCH 1: LCID 2, TMGI 0x00001009f165, 238.1.1.111:40101 +modem[7891]: ----- +```` + +#### MBMS Middleware +Now that the MBMS Modem is running and exposes the FLUTE encoded content via UDP multicast to the MBMS Middleware we can start the latter as well. The MBMS Middleware listens to the local tun interface. Received multicast packets from the Receive Process are FLUTE decoded and the files are stored in the cache. + +In this example, we start the MBMS Middleware right from the build folder. That way potential debug output is directly logged to the terminal. + +1. Navigate to the build folder of the MBMS Middleware, for instance: `cd /home/user/rt-mbms-mw/build` +2. Start the middleware: `./mw` + +The output should look like this: + +```` +mw[6611]: 5g-mag-rt mw v0.9.0 starting up +```` + + +#### Webinterface + +For the purpose of this documentation we use the Webinterface to monitor the MBMS Modem and the MBMS Middleware. Moreover, we use the hls.js integration in the Webinterface to playback the final HLS stream. In order run the Webinterface perform the steps describe [here](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/Webinterface#run-the-webinterface). + +The Webinterface can also be started directly from its root folder: +1. cd `/home/user/rt-wui` +2. `node app.js` + +### Using an SDR card + +Todo + +## Playback +The final playback is similar for both use cases _"Using an SDR card"_ and _"Using a prerecorded sample file"_. + +### Webinterface +In order to use the webinterface for playback perform the following steps: + +1. Navigate to `http://localhost` in your browser +2. Click `Middleware v.0.9.1` on the top right corner +3. Click on the play button below the stream information +4. An instance of hls.js is initialized playing the HLS stream + +The output for step 3 and step 4 should look similar to this: + + + + + +### VLC +It is also possible to use other players like VLC. Simply paste the url to the `index.m3u8` into the VLC player. As an example the URL can look the following: `http://localhost/f/00001009f165/index.m3u8`. Replace the `localhost` part with the IP of the machine that is running the MBMS Middleware in order to access the stream from other machines in the same network. + + +## Troubleshooting + +### I/O errors in the MBMS Modem +If you encounter I/O errors in the MBMS Modem there are a few things to try: + +1. Verify that the correct network interface is used to output the UDP multicast. See https://github.com/5G-MAG/Documentation-and-Architecture/wiki/mbms-modem#multicast-routing +2. Make sure to start/stop the MBMS Modem as a service before launching it from the `build` folder: + - `systemctl start 5g-mag-rt-modem` + - `systemctl stop 5g-mag-rt-modem` +3. Try starting the MBMS Modem with sudo rights: `sudo ./modem -f "PathToSample/samplefile.raw" -b 5 + + +## References + +[1] [https://en.wikipedia.org/wiki/HTTP_Live_Streaming](https://en.wikipedia.org/wiki/HTTP_Live_Streaming) diff --git a/pages/lte-based-5g-broadcast/docker-implementation.md b/pages/lte-based-5g-broadcast/docker-implementation.md new file mode 100644 index 00000000..6a5a2da9 --- /dev/null +++ b/pages/lte-based-5g-broadcast/docker-implementation.md @@ -0,0 +1,105 @@ +--- +layout: default +title: Docker implementation +parent: Tutorials +grand_parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 3 +--- + +# Docker Implementation for rt-mbms client side + +## Introduction + +The repository contains the implementation of rt-mbms processes (5G broadcast receiver) in docker containers. The [documentation](https://github.com/5G-MAG/Documentation-and-Architecture/wiki) is followed to create the containers. Modem, mbms-mw, wui and nginx are run in individual containers which interact each other using the native docker network. + +## Pre-requisites + +### Table of content + +* [Hardware requirements](https://github.com/5G-MAG/rt-mbms-docker#hardware-requirements) +* [Supported SDR](https://github.com/5G-MAG/rt-mbms-docker#supported-sdr) +* [OS](https://github.com/5G-MAG/rt-mbms-docker#os) +* [Reference setups](https://github.com/5G-MAG/rt-mbms-docker#reference-setups) + +### Hardware requirements +It is hard to define system requirements because these depend e.g. on bandwidth (e.g., 5, 8, 10 MHz), modulation coding scheme and other parameters. Generally, a CPU with 4 cores and 8 threads, 16 GB RAM and - in case a SDR and not just sample files are used - an USB 3.0 port is necessary. Furthermore, HDMI, Wifi, LAN and sufficient SSD space (for sample files,...) is recommended. + +### Supported SDR +To use the rt-mbms processes in a live setup a SDR (software defined radio) is required. +[MBMS Modem](https://github.com/5G-MAG/Documentation-and-Architecture/wiki/MBMS-Modem) supports [SoapyAPI](https://github.com/pothosware/SoapySDR/wiki), thus any supported SDR should work with the 5G-MAG Reference Tools (please keep in mind that not every SDR hardware is sufficient for receiving an 5G Broadcast signal (e.g. bandwidth, sample rate...)). + +We recommend using a LimeSDR or USRP n210 as in the current reference. + +### OS +We recommend to use [Ubuntu 20.04 LTS (64 bit)](https://ubuntu.com/) + +### Reference setups + +#### Specs + +* Intel NUC [Intel Provo Canyon BKNUC8V7PNH](https://www.amazon.de/gp/product/B08CNLFM1N/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1) +* RAM [Crucial RAM CT16G4SFRA266 16GB DDR4 2666 MHz CL19](https://www.amazon.de/gp/product/B08C4VKYFG/ref=ppx_yo_dt_b_asin_title_o00_s01?ie=UTF8&psc=1) +* SSD [SanDisk Extreme PRO M.2 NVMe 3D SSD 500 GB interne SSD](https://www.amazon.de/gp/product/B07BSSFB4N/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1) +* Power cord [LINDY 30406 - Power cord for notebooks (Schuko) 3m](https://www.amazon.de/gp/product/B00K65JGUY/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1) + +The full specification of the Intel NUC can be found [here](https://ark.intel.com/content/www/us/en/ark/products/199110/intel-nuc-8-pro-kit-nuc8v7pnh.html). + + +Testcase +The 5G-MAG Reference Tools system was tested live, with sample files, with bandwidths 3, 5, 6, 7, 8 and 10 MHz, SCS 1.25 and 7.5 kHz with multiple services (RTP, HLS). + + +## Step by step installation of rt-mbms-process in docker: + +* Install the docker engine. +* Build the Docker Images +* Running Containers +* Execute the Containers + + +### Installing Docker + +[Dockerhub](https://docs.docker.com/engine/install/ubuntu/) hosts the docker engine repos which can be easiy installed locally to start working with docker. + +**Alternatively**, easy to use shell script can be found [here](https://github.com/5G-MAG/rt-mbms-modem/blob/development/dockerPrereq.sh)! + +### Build Images +The files for docker implementation are contained in [modem](https://github.com/5G-MAG/rt-mbms-modem/tree/development/modem), [middleware](https://github.com/5G-MAG/rt-mbms-mw/tree/development/middleware), [wui](https://github.com/5G-MAG/rt-wui/tree/development/wui) and [nginx](https://github.com/5G-MAG/rt-wui/tree/development/nginx). + +The Dockerfile helps to create a docker image, which can be used to run the containers. +The command `docker build` uses by default the Dockerfile to create the image. For custom docker files go with +`docker build -f /path/to/Dockerfile -t target_image_name /location/of/Dockerfile` +There is a build.sh script on each folder for easy access. +**PS:** Please edit the appropriate path to the sample files in the last line of [startup](https://github.com/5G-MAG/rt-mbms-modem/tree/development/modem/scripts) script for modem process before building the container. + +### Running the containers + +The modem, middleware, wui and nginx containers can be run using the run.sh script in their respective folders. + +The run.sh script contains the `docker logs` command which helps the user to have an idea on what is happening inside the containers. + +**PS:** Please build docker images and run the containers in the order of modem, mbms-mw, wui, nginx respectively, so that the IP addresses of the containers are + + Modem - 172.17.0.2 + mbms-mw - 172.17.0.3 + wui - 172.17.0.4 + nginx - 172.17.0.5 + + `sudo docker inspect container_name | grep IPAddress` gives the ip of the container. + + If you have different IPs please configure the corresponding IPs in 5gmag-rt.conf , wui and nginx config files. + +### Executing the Containers + +The docker exec commands helps you to get into the container. +`docker exec -it container_name /bin/bash` + +The list of the containers (running or exited) can be viewed using : +`docker ps -a ` . The staus column shows the staus of each container. + +A running container can be stopped using: +`docker stop container_name` + +An exited or obsolete container can be removed using : +`docker rm container_name` diff --git a/pages/lte-based-5g-broadcast/features.md b/pages/lte-based-5g-broadcast/features.md new file mode 100644 index 00000000..4fc43efa --- /dev/null +++ b/pages/lte-based-5g-broadcast/features.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Features +parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 1 +--- + +# List of features under implementation diff --git a/pages/lte-based-5g-broadcast/hardware-requirements.md b/pages/lte-based-5g-broadcast/hardware-requirements.md new file mode 100644 index 00000000..aba88f8c --- /dev/null +++ b/pages/lte-based-5g-broadcast/hardware-requirements.md @@ -0,0 +1,94 @@ +--- +layout: default +title: Hardware requirements +parent: Tutorials +grand_parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 1 +--- + +# Hardware requirements +## Table of content +* Hardware requirements +* Supported SDR +* OS +* Reference setups + +## Hardware requirements + +It is hard to define system requirements because these depend e.g. on bandwidth (e.g., 5, 8, 10 MHz), modulation coding +scheme and other parameters. Generally, a CPU with 4 cores and 8 threads, 16 GB RAM and - in case a SDR and not just +sample files are used - an USB 3.0 port is necessary. Furthermore, HDMI, Wifi, LAN and sufficient SSD space (for sample +files,...) is recommended. + +If you want to be sure that everything is working, we recommend to use our reference system. +> **Note** We would appreciate if you let us know about your setup to list it below. Drop us a mail [reference-tools@5g-mag.com](mailto:reference-tools@5g-mag.com). + +## Supported SDR + +To use the 5G-MAG Reference Tools in a live setup a SDR (software defined radio) is required. + +5G-MAG Reference Tools *[MBMS Modem](MBMS-Modem)* supports [SoapyAPI](https://github.com/pothosware/SoapySDR/wiki), thus any +supported SDR should work with the 5G-MAG Reference Tools (please keep in mind that not every SDR hardware is sufficient for receiving an 5G +Broadcast signal (e.g. bandwidth, sample rate...)). + +We recommend using a [LimeSDR Mini](https://limemicro.com/products/boards/limesdr-mini/) +or [BladeRF 2.0 Micro XA4](https://www.nuand.com/product/bladeRF-xA4). A [HackRF One](https://greatscottgadgets.com/hackrf/one/) can also be used. +Each has to be connected via USB to the computer and to your antenna via SMA connector. + +* LimeSDR Mini can be ordered e.g. at [CrowdSupply](https://www.crowdsupply.com/lime-micro/limesdr-mini/) for around + 160 EUR +* BladeRF can be ordered e.g. at [nuand](https://www.nuand.com/product/bladeRF-xA4) for around 480 EUR. +* HackRF One are widely available. Please see [their website](https://greatscottgadgets.com/hackrf/one/) for availability, typically around 250 EUR. +* Ettus USRP N310 +* Ettus USRP B210 + +> **Note** If you are using another SDR, please let us know that we can update the list above. Drop us a mail [reference-tools@5g-mag.com](mailto:reference-tools@5g-mag.com). + +> **Note** If you only want to test with sample files, a SDR is NOT required. + +## OS + +We recommend to use [Ubuntu 20.04 LTS (64 bit)](https://ubuntu.com/), but if you build everything from source, also +other OS should work (e.g., Ubuntu 18, Debian, Raspbian...) +> **Note** We would appreciate if you let us know about your setup to list it below. Drop us a mail [reference-tools@5g-mag.com](mailto:reference-tools@5g-mag.com). + +## Reference setups + +### 5G-MAG Reference Tools system + +#### Specs + +

+ +| Component | Part | Approx. price (EUR) | +| ------------- |-------------|-------------| +| Intel NUC | Intel Provo Canyon BKNUC8V7PNH | 600 | +| RAM | Crucial RAM CT16G4SFRA266 16GB DDR4 2666 MHz CL19 | 60 | +| SSD| SanDisk Extreme PRO M.2 NVMe 3D SSD 500 GB interne SSD | 70 | +| Power cord| LINDY 30406 - Power cord for notebooks (Schuko) 3m | 10 | +| _Optional:_ | +| _ +Display_| Capacitive display 7" IPS 1024x600 | 70 | + +The full specification of the Intel NUC can be +found [here](https://ark.intel.com/content/www/us/en/ark/products/199110/intel-nuc-8-pro-kit-nuc8v7pnh.html). + +If you want to fully integrate the SDR into the NUC as seen on the picture +above: [5G-MAG Reference Tools casing](https://github.com/johannmika/obeca-ors-casing) + +#### Testcases + +The 5G-MAG Reference Tools system was tested live, with sample files, with bandwidths 3, 5, 6, 7, 8 and 10 MHz, SCS 1.25 and 7.5 kHz and +modulation coding schemes (MCS) 1-26 with multiple services (RTP, HLS). Max CPU (2 services, 10 MHz, MCS26) was below +60%. + +### VM + +#### Specs + +Ubuntu 20 with Hyper-V on Windows 10. + +#### Testcases + +We tested the build process and sample files (1 RTP service, 5 MHz). diff --git a/pages/lte-based-5g-broadcast/index.md b/pages/lte-based-5g-broadcast/index.md index d54fc6b1..151af9fe 100644 --- a/pages/lte-based-5g-broadcast/index.md +++ b/pages/lte-based-5g-broadcast/index.md @@ -1,68 +1,9 @@ --- layout: default -title: MBMS and LTE based 5G Broadcast +title: MBMS and LTE-based 5G Broadcast has_children: true +nav_order: 4 --- -# Implementing MBMS: LTE-based 5G Broadcast -Information about LTE-based 5G Broadcast can be found at www.5g-mag.com/5gbroadcast -*** -## 📑 Specifications and architecture -* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/MBMS-&-LTE-based-5G-Broadcast:-Relevant-Specifications) -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#5gbroadcast) -* 5G Broadcast Overview Slides by Bitstem can be found [here](https://drive.google.com/file/d/1zkoNpFfhRE91OjFILs7K_t1CJzGoGQLA/view?usp=drive_link) -*** - -## 🚧 On-going projects -Check the [Projects](MBMS-&-LTE-based-5G-Broadcast-Projects) under development for MBMS & LTE-based 5G Broadcast -*** - -## ▶️ Using the tools -Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) and check the wikis below for more information -* [Quick Start Guide](https://github.com/5G-MAG/Getting-Started/wiki/Configuration-Quick-Start-Guide) -* [HLS playback over 5G Broadcast](https://github.com/5G-MAG/Getting-Started/wiki/Use-Case:-HLS-playback-over-5G-Broadcast) -* [RTP playback over 5G Broadcast](https://github.com/5G-MAG/Getting-Started/wiki/Use-Case:-RTP-Playback-over-5G-Broadcast) -* [Contanerised rt-mbms setup](https://github.com/5G-MAG/Getting-Started/wiki/5G-MAG-Reference-Tools:-Docker-Implementation-of-RT-MBMS-processes) -* [Seamless switching between unicast and 5G Broadcast](https://github.com/5G-MAG/Getting-Started/wiki/Use-Case:-Seamless-switching) -*** - -## ⭐ Related repositories -* Check the Repositories relevant to MBMS & LTE-based 5G Broadcast: Code, releases, packages, dockers, guidelines,... - -### 5G Broadcast Transmitter for MBMS-dedicated cells and basic MBMS gateway: [rt-mbms-tx](https://github.com/5G-MAG/rt-mbms-tx) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-tx#readme) -* [Releases](https://github.com/5G-MAG/rt-mbms-tx/releases) - -### 5G Broadcast Transmitter for QRD (Qualcomm Reference Design) and CRD (Commercial Research Device): [rt-mbms-tx-for-qrd-and-crd](https://github.com/5G-MAG/rt-mbms-tx-for-qrd-and-crd) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-tx-for-qrd-and-crd#readme) - -### MBMS Modem: [rt-mbms-modem](https://github.com/5G-MAG/rt-mbms-modem) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-modem#readme) -* [Releases](https://github.com/5G-MAG/rt-mbms-modem/releases) -* [Docker](https://github.com/5G-MAG/rt-mbms-modem/tree/development/modem) - -### MBMS Middleware: [rt-mbms-mw](https://github.com/5G-MAG/rt-mbms-mw) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-mw#readme) -* [Releases](https://github.com/5G-MAG/rt-mbms-mw/releases) -* [Docker](https://github.com/5G-MAG/rt-mbms-mw/tree/development/middleware) - -### Tools common to various projects: [rt-common-shared](https://github.com/5G-MAG/rt-common-shared) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-common-shared#readme) - -## Repositories related to Multicast IP delivery -### File Delivery over Unidirectional Transport (FLUTE): [rt-libflute](https://github.com/5G-MAG/rt-libflute) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-libflute#readme) -* [Releases](https://github.com/5G-MAG/rt-libflute/releases) - -## Repositories with dependencies related to LTE -* [srsRAN](https://github.com/5G-MAG/srsRAN) - -## Auxiliary repositories: -### MBMS Web User Interface: [rt-wui](https://github.com/5G-MAG/rt-wui) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-wui#readme) -* [Releases](https://github.com/5G-MAG/rt-wui/releases) -* [Docker](https://github.com/5G-MAG/rt-wui/tree/development/wui) - -### MBMS Examples: [rt-mbms-examples](https://github.com/5G-MAG/rt-mbms-examples) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-examples#readme) -* [Releases](https://github.com/5G-MAG/rt-mbms-examples/releases) +# MBMS & LTE-based 5G Broadcast + diff --git a/pages/lte-based-5g-broadcast/projects.md b/pages/lte-based-5g-broadcast/projects.md new file mode 100644 index 00000000..10c16704 --- /dev/null +++ b/pages/lte-based-5g-broadcast/projects.md @@ -0,0 +1,25 @@ +--- +layout: default +title: Projects +parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 2 +--- + +# 🚧 Related projects + +## MBMS: Seamless switching between broadcast and unicast +Seamless switching between LTE-based 5G Broadcast and OTT unicast +* [Kanban board](https://github.com/orgs/5G-MAG/projects/7) + +## MBMS: MBMS Modem - Rel 17 Support +The required issues and features requests to make the MBMS Model Rel 17 compliant +* [Kanban board](https://github.com/orgs/5G-MAG/projects/24) + +## MBMS: 5G Broadcast Transmitters +Project for any improvements to the rt-mbms-tx and rt-mbms-tx-for-qrd-and-crd. +* [Kanban board](https://github.com/orgs/5G-MAG/projects/29) + +## MBMS: Web User Interface +Project for any improvements to the rt-mbms-wui +* [Kanban board](https://github.com/orgs/5G-MAG/projects/28) diff --git a/pages/lte-based-5g-broadcast/quick-start-guide.md b/pages/lte-based-5g-broadcast/quick-start-guide.md new file mode 100644 index 00000000..ccf08c0a --- /dev/null +++ b/pages/lte-based-5g-broadcast/quick-start-guide.md @@ -0,0 +1,258 @@ +--- +layout: default +title: Quick start guide +parent: Tutorials +grand_parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 0 +--- + +# Quick start guide +## Setup Resources +* [Hardware, OS & SDR Requirements](hardware-requirements.md) +* [Sample Files](sample-files.md) +* [Service Announcement Formats](https://github.com/5G-MAG/rt-common-shared/wiki/MBMS-Service-Announcement-Files) + +## Preparation +After each reboot of your machine run: + +1. `sudo systemctl start 5gmag-rt-modem` +2. `sudo systemctl stop 5gmag-rt-modem` + +Make sure that you have the latest nginx config enabled in `/etc/nginx/sites-enabled/5gmag-rt-wui`. Compare it to the config that is provided here: https://github.com/5G-MAG/rt-common-shared/blob/feature/mbms/mbms/common-config/5gmag-rt-wui + +## Different SA formats +The 5G-MAG Reference Tools support three different service announcement formats. In the examples below we either use the `5gmag_legacy` format for the recordings or the `default` format for seamless switching. To use the seamless switching format that was agreed in 5G-MAG you have to use `5gmag_bc_uc`. The corresponding service announcement example file is labeled `bootstrap.multipart.seamlessswitching.hls.5gmag`. More details can be found here: https://github.com/5G-MAG/rt-common-shared/wiki/MBMS-Service-Announcement-Files + +## Playback of 5GBC together with the MBMS Modem + +Set the target configuration in `etc/5gmag-rt-conf`: + +```` + seamless_switching: { + enabled: ; + truncate_cdn_playlist_segments: 3 + } + bootstrap_format: ; + local_service: { + enabled: false + } +```` + +## Playback of legacy recordings + +Set the configuration in `etc/5gmag-rt-conf` to use the legacy format: + +```` + seamless_switching: { + enabled: false; + } + bootstrap_format: "5gmag_legacy"; + local_service: { + enabled: false; + } +```` + +If you want to play the recorded content in a loop consider increasing the cache values to avoid segments with the same url being deleted immediately: + +```` + cache: { + max_segments_per_stream: 30; + max_file_age: 1200; /* seconds */ + max_total_size: 128; /* megabyte */ + } +```` + +## FLUTE ffmpeg watchfolder with signaling server + +### HLS seamless switching +Set the config file for the rt-mbms-examples project in `flute-ffmpeg\config\default.cfg` to: + +```` +general : { + multicast_ip = "238.1.1.111"; + multicast_port = 40101; + mtu = 1500; + rate_limit = 1200000; + watchfolder_path = ""; + path_to_transmit = "" + stream_type = "hls"; + transmit_service_announcement = true; + dash: { + number_of_init_segments = 3; + resend_init_in_sec = 30; + service_announcement = "../supporting_files/mbms/bootstrap_examples/bootstrap.multipart.legacy.dash"; + }; + hls: { + service_announcement = "../supporting_files/mbms/bootstrap_examples/bootstrap.multipart.seamlessswitching.hls"; + media_playlists_to_ignore_in_multicast = [] + } + webserver_port: 3010; +} +```` + +Note: For seamless switching to work the `watchfolder_path` needs to point to a webserver that hosts the segments. + +Enable seamless switching in the `etc/5gmag-rt-conf` file: + +```` + seamless_switching: { + enabled: true; + truncate_cdn_playlist_segments: 3 + } +```` + +### DASH BC + +Disable seamless switching and set the right SA format in the `etc/5gmag-rt-conf` file: + +```` + seamless_switching: { + enabled: false; + truncate_cdn_playlist_segments: 3 + }, +bootstrap_format: "5gmag_legacy"; + +```` + +Adjust the config for flute-ffmpeg: + +```` +general : { + multicast_ip = "238.1.1.111"; + multicast_port = 40101; + mtu = 1500; + rate_limit = 1200000; + watchfolder_path = "/home/dsi/5G-MAG/simple-express-server/public/watchfolder/dash"; + path_to_transmit = "" + stream_type = "dash"; + transmit_service_announcement = true; + dash: { + number_of_init_segments = 3; + resend_init_in_sec = 30; + service_announcement = "../supporting_files/mbms/bootstrap_examples/bootstrap.multipart.legacy.dash"; + }; + hls: { + service_announcement = "../supporting_files/mbms/bootstrap_examples/bootstrap.multipart.seamlessswitching.hls"; + media_playlists_to_ignore_in_multicast = [] + } + webserver_port: 3010; +} +```` + +### HLS BC + +Disable seamless switching and set the right SA format in the `etc/5gmag-rt-conf` file: + +```` + seamless_switching: { + enabled: false; + truncate_cdn_playlist_segments: 3 + }, +bootstrap_format: "5gmag_legacy"; + +```` + +Adjust the config for flute-ffmpeg: + +```` +general : { + multicast_ip = "238.1.1.111"; + multicast_port = 40101; + mtu = 1500; + rate_limit = 1200000; + watchfolder_path = "/home/dsi/5G-MAG/simple-express-server/public/watchfolder/hls"; + path_to_transmit = "watchfolder/hls/" + stream_type = "hls"; + transmit_service_announcement = true; + dash: { + number_of_init_segments = 3; + resend_init_in_sec = 30; + service_announcement = "../supporting_files/mbms/bootstrap_examples/bootstrap.multipart.legacy.dash"; + }; + hls: { + service_announcement = "../supporting_files/mbms/bootstrap_examples/bootstrap.multipart.legacy.hls"; + media_playlists_to_ignore_in_multicast = [] + } + webserver_port: 3010; +} +```` + +## FLUTE ffmpeg with local SA + +In this example we dont need the http server that signals the `mch_info.json`. Instead, we start the MBMS Middleware directly with a local service announcement file + +### General +Enable the local service in the `etc/5gmag-rt-conf` file: +```` + local_service: { + enabled: true; + } +```` + +Disable `transmit_service_announcement` in the flute-ffmpeg `default.cfg` file: + +```` +transmit_service_announcement = false; +```` + +### HLS seamless switching + +Point to a local service announcement file with seamless switching support in the `etc/5gmag-rt-conf` file e.g.: + +```` + local_service: { + bootstrap_file: "/home/dsi/5G-MAG/rt-common-shared/mbms/bootstrap_examples/bootstrap.multipart.seamlessswitching.hls"; + } +```` + +Enable seamless switching in the `etc/5gmag-rt-conf` file: + +```` + seamless_switching: { + enabled: true; + truncate_cdn_playlist_segments: 3 + }, +bootstrap_format: ""; + +```` + +### HLS BC + +Point to a local service announcement in the `etc/5gmag-rt-conf` file e.g.: +```` + local_service: { + bootstrap_file: "/home/dsi/5G-MAG/rt-common-shared/mbms/bootstrap_examples/bootstrap.multipart.legacy.hls"; + } +```` + +Disable seamless switching and set the right SA format in the `etc/5gmag-rt-conf` file: + +```` + seamless_switching: { + enabled: false; + truncate_cdn_playlist_segments: 3 + }, +bootstrap_format: "5gmag_legacy"; + +```` + +### DASH BC + +Point to a local service announcement in the `etc/5gmag-rt-conf` file e.g.: +```` + local_service: { + bootstrap_file: "/home/dsi/5G-MAG/rt-common-shared/mbms/bootstrap_examples/bootstrap.multipart.legacy.dash"; + } +```` + +Disable seamless switching and set the right SA format in the `etc/5gmag-rt-conf` file: + +```` + seamless_switching: { + enabled: false; + truncate_cdn_playlist_segments: 3 + }, +bootstrap_format: "5gmag_legacy"; + +```` diff --git a/pages/lte-based-5g-broadcast/repositories.md b/pages/lte-based-5g-broadcast/repositories.md new file mode 100644 index 00000000..302f23b3 --- /dev/null +++ b/pages/lte-based-5g-broadcast/repositories.md @@ -0,0 +1,46 @@ +--- +layout: default +title: Repositories +parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 3 +--- + +# ⭐ Related repositories +## 5G Broadcast Transmitter for MBMS-dedicated cells and basic MBMS gateway: [rt-mbms-tx](https://github.com/5G-MAG/rt-mbms-tx) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-tx#readme) +* [Releases](https://github.com/5G-MAG/rt-mbms-tx/releases) + +## 5G Broadcast Transmitter for QRD (Qualcomm Reference Design) and CRD (Commercial Research Device): [rt-mbms-tx-for-qrd-and-crd](https://github.com/5G-MAG/rt-mbms-tx-for-qrd-and-crd) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-tx-for-qrd-and-crd#readme) + +## MBMS Modem: [rt-mbms-modem](https://github.com/5G-MAG/rt-mbms-modem) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-modem#readme) +* [Releases](https://github.com/5G-MAG/rt-mbms-modem/releases) +* [Docker](https://github.com/5G-MAG/rt-mbms-modem/tree/development/modem) + +## MBMS Middleware: [rt-mbms-mw](https://github.com/5G-MAG/rt-mbms-mw) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-mw#readme) +* [Releases](https://github.com/5G-MAG/rt-mbms-mw/releases) +* [Docker](https://github.com/5G-MAG/rt-mbms-mw/tree/development/middleware) + +## Tools common to various projects: [rt-common-shared](https://github.com/5G-MAG/rt-common-shared) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-common-shared#readme) + +# Repositories related to Multicast IP delivery +## File Delivery over Unidirectional Transport (FLUTE): [rt-libflute](https://github.com/5G-MAG/rt-libflute) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-libflute#readme) +* [Releases](https://github.com/5G-MAG/rt-libflute/releases) + +# Repositories with dependencies related to LTE +* [srsRAN](https://github.com/5G-MAG/srsRAN) + +# Auxiliary repositories: +## MBMS Web User Interface: [rt-wui](https://github.com/5G-MAG/rt-wui) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-wui#readme) +* [Releases](https://github.com/5G-MAG/rt-wui/releases) +* [Docker](https://github.com/5G-MAG/rt-wui/tree/development/wui) + +## MBMS Examples: [rt-mbms-examples](https://github.com/5G-MAG/rt-mbms-examples) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-examples#readme) +* [Releases](https://github.com/5G-MAG/rt-mbms-examples/releases) diff --git a/pages/lte-based-5g-broadcast/sample-files.md b/pages/lte-based-5g-broadcast/sample-files.md new file mode 100644 index 00000000..b147bc71 --- /dev/null +++ b/pages/lte-based-5g-broadcast/sample-files.md @@ -0,0 +1,59 @@ +--- +layout: default +title: Sample files +parent: Tutorials +grand_parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 2 +--- + +# Sample files +In order to support application developers as well as 5G-MAG contributors for testing their improvements, ORS captured sample files ("raw data" = digitized I/Q data at [LimeSDR Mini](https://www.crowdsupply.com/lime-micro/limesdr-mini/) output) directly from a 5G BC transmitter. You can also capture sample files using the [capture command of the Receive Process](https://github.com/5G-MAG/rt-mbms-modem#capture-and-running-of-sample-files). + +#### RTP payload: +3 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload 3.5 Mbit RTP: +* [3MHz_MCS16_1kHz25_RTP_3.5.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/3MHz_MCS16_1kHz25_RTP_3.5.raw) (7.9 GB) + +5 MHz bandwidth, subcarrier spacing 1.25 kHz or 7.5 kHz, Modulation Coding Scheme 16 (16QAM) with Payload 3.5 Mbit RTP: +* [5MHz_MCS16_1kHz25_RTP_3.5.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/5MHz_MCS16_1kHz25_RTP_3.5.raw) (14.5 GB) +* [5MHz_MCS16_7kHz5_RTP_3.5.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/5MHz_MCS16_7kHz5_RTP_3.5.raw) (11.4 GB) + +6 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload 3.5 Mbit RTP: +* [6MHz_MCS16_1kHz25_RTP_3.5.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/6MHz_MCS16_1kHz25_RTP_3.5.raw) (33.7 GB) + +7 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload 3.5 Mbit RTP: +* [7MHz_MCS16_1kHz25_RTP_3.5.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/7MHz_MCS16_1kHz25_RTP_3.5.raw) (23.6 GB) + +8 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload 3.5 Mbit RTP: +* [8MHz_MCS16_1kHz25_RTP_3.5.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/8MHz_MCS16_1kHz25_RTP_3.5.raw) (23.5 GB) + +10 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload 3.5 Mbit RTP: +* [10MHz_MCS16_1kHz25_RTP_3.5.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/10MHz_MCS16_1kHz25_RTP_3.5.raw) (21.6 GB) + +#### HLS payload: + +3 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload HLS: +* [3MHz_MCS16_1kHz25_HLS_q6a.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/3MHz_MCS16_1kHz25_HLS_q6a.raw) (5.9 GB) + +5 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload HLS: +* [5MHz_MCS16_1kHz25_HLS_q6a.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/5MHz_MCS16_1kHz25_HLS_q6a.raw) (12.2 GB) + +8 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload HLS: +* [8MHz_MCS16_1kHz25_HLS_q6a.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/8MHz_MCS16_1kHz25_HLS_q6a.raw) (25.4 GB) + +10 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload HLS: +* [10MHz_MCS16_1kHz25_HLS_q6a.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/10MHz_MCS16_1kHz25_HLS_q6a.raw) (17.6 GB) + +#### DASH payload: +5 MHz bandwidth, subcarrier spacing 1.25 kHz, Modulation Coding Scheme 16 (16QAM) with Payload DASH: +* [5MHz_MCS16_1kHz25_DASH_q6a.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/5MHz_MCS16_1kHz25_DASH_q6a.raw) (10.4 GB) + +#### Sample files for rt-mbms-modem development Rel14/Rel16 only: +* Rel.14 CAS [5MHz_MCS16_1kHz25_HLS_q4a_Rel14.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/5MHz_MCS16_1kHz25_HLS_q4a_Rel14.raw) (5.4 GB) +* Rel.16 CAS [5MHz_MCS16_1kHz25_HLS_q4a_Rel16.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/5MHz_MCS16_1kHz25_HLS_q4a_Rel16.raw) (5.1 GB) (PBCH Repetition, Aggregation Level 16, CFI-Indicator in MIB-MBMS) + * **Note**: Release 16 is currently not supported in the rt-mbms-modem. This stream can be used for development purposes. +* Rel.16 CAS [8MHz_MCS16_1kHz25_Rel16.raw](https://obeca-testdaten.s3.eu-central-1.amazonaws.com/8MHz_MCS16_1kHz25_Rel16.raw) (13.4 GB) (PBCH Repetition, Aggregation Level 16, CFI-Indicator in MIB-MBMS) + * **Note**: Release 16 is currently not supported in the rt-mbms-modem. This stream can be used for development purposes. +> Note: The sample files were captured in Nov 2021. An mp4 file of the movie [Big Buck Bunny](https://www.bigbuckbunny.org) (published under the [Creative Commons Attribution 3.0 license](https://creativecommons.org/licenses/by/3.0/), (c) copyright 2008, Blender Foundation / [www.bigbuckbunny.org](https://www.bigbuckbunny.org)) was looped to create RTP and HLS streams. Play duration of each sample file is 3-5 minutes. + +If you need any further sample files, please get in contact with us **[reference-tools@5g-mag.com](mailto:reference-tools@5g-mag.com)**. diff --git a/pages/lte-based-5g-broadcast/specifications.md b/pages/lte-based-5g-broadcast/specifications.md new file mode 100644 index 00000000..b4ea0397 --- /dev/null +++ b/pages/lte-based-5g-broadcast/specifications.md @@ -0,0 +1,10 @@ +--- +layout: default +title: Specifications +parent: MBMS and LTE-based 5G Broadcast +has_children: false +nav_order: 0 +--- +# 📑 Specifications and relevant references +* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/MBMS-&-LTE-based-5G-Broadcast:-Relevant-Specifications) +* A list of relevant 3GPP Work Items can be found at [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/MBMS-&-LTE-based-5G-Broadcast:-Relevant-Work-Items) diff --git a/pages/lte-based-5g-broadcast/tutorials.md b/pages/lte-based-5g-broadcast/tutorials.md new file mode 100644 index 00000000..9e8aa70a --- /dev/null +++ b/pages/lte-based-5g-broadcast/tutorials.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Tutorials +parent: MBMS and LTE-based 5G Broadcast +has_children: true +nav_order: 4 +--- + +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. +* We are working on it... diff --git a/pages/multimedia-content-delivery/features.md b/pages/multimedia-content-delivery/features.md new file mode 100644 index 00000000..0eeeb71c --- /dev/null +++ b/pages/multimedia-content-delivery/features.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Features +parent: Multimedia Content Delivery +has_children: false +nav_order: 1 +--- + +# List of features under implementation diff --git a/pages/multimedia-content-delivery/index.md b/pages/multimedia-content-delivery/index.md index 890c13d1..053dcda4 100644 --- a/pages/multimedia-content-delivery/index.md +++ b/pages/multimedia-content-delivery/index.md @@ -2,32 +2,8 @@ layout: default title: Multimedia Content Delivery has_children: true +nav_order: 3 --- -# Implementing multimedia content delivery protocols -These are a series of implementations that may be used in combination with other systems. -*** -## 📑 Specifications and architecture -* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/Multimedia-content-delivery:-Relevant-Specifications) -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#multimedia-protocols) -*** - -## 🚧 On-going projects -Check the [Projects](https://github.com/5G-MAG/Getting-Started/wiki/Multimedia-content-delivery-Projects) under development for multimedia content delivery protocols. -*** - -## ▶️ Using the tools -Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) and check the wikis below for more information -* Developers are working on it... stay tuned for news. -*** - -## ⭐ Related repositories -* Check the Repositories relevant to multimedia content delivery protocols: Code, releases, packages, dockers, guidelines,... - -## Repositories related to Multicast IP delivery -### File Delivery over Unidirectional Transport (FLUTE): [rt-libflute](https://github.com/5G-MAG/rt-libflute) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-libflute#readme) -* [Releases](https://github.com/5G-MAG/rt-libflute/releases) - -### Real-time Object delivery over Unidirectional Transport (ROUTE), integrated within MBMS Middleware: [rt-mbms-mw / route-gpac](https://github.com/5G-MAG/rt-mbms-mw/tree/route-gpac) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-mw/tree/route-gpac#readme) +# Multimedia content delivery protocols + diff --git a/pages/multimedia-content-delivery/projects.md b/pages/multimedia-content-delivery/projects.md new file mode 100644 index 00000000..ac268681 --- /dev/null +++ b/pages/multimedia-content-delivery/projects.md @@ -0,0 +1,16 @@ +--- +layout: default +title: Projects +parent: Multimedia Content Delivery +has_children: false +nav_order: 2 +--- + +# 🚧 Related projects +## MBMS: Support for ROUTE +All issues and functionality around ROUTE support for the 5G Broadcast components +* [Kanban board](https://github.com/orgs/5G-MAG/projects/15) + +## MBMS: Support for FLUTE +All issues and functionality around FLUTE support for the 5G Broadcast components. Includes functionality like Forward Error Correction (FEC). +* [Kanban board](https://github.com/orgs/5G-MAG/projects/14) diff --git a/pages/multimedia-content-delivery/repositories.md b/pages/multimedia-content-delivery/repositories.md new file mode 100644 index 00000000..9779d980 --- /dev/null +++ b/pages/multimedia-content-delivery/repositories.md @@ -0,0 +1,18 @@ +--- +layout: default +title: Repositories +parent: Multimedia Content Delivery +has_children: false +nav_order: 3 +--- + +# ⭐ Related repositories + +## Repositories related to Multicast IP delivery + +### File Delivery over Unidirectional Transport (FLUTE): [rt-libflute](https://github.com/5G-MAG/rt-libflute) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-libflute#readme) +* [Releases](https://github.com/5G-MAG/rt-libflute/releases) + +### Real-time Object delivery over Unidirectional Transport (ROUTE), integrated within MBMS Middleware: [rt-mbms-mw / route-gpac](https://github.com/5G-MAG/rt-mbms-mw/tree/route-gpac) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-mbms-mw/tree/route-gpac#readme) diff --git a/pages/multimedia-content-delivery/specifications.md b/pages/multimedia-content-delivery/specifications.md new file mode 100644 index 00000000..e6174d87 --- /dev/null +++ b/pages/multimedia-content-delivery/specifications.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Specifications +parent: Multimedia Content Delivery +has_children: false +nav_order: 0 +--- +# 📑 Specifications and relevant references +* Information about relevant specifications can be found at the [Standards Wiki](https://github.com/5G-MAG/Standards/wiki/Multimedia-content-delivery:-Relevant-Specifications) diff --git a/pages/multimedia-content-delivery/tutorials.md b/pages/multimedia-content-delivery/tutorials.md new file mode 100644 index 00000000..1b60e5d1 --- /dev/null +++ b/pages/multimedia-content-delivery/tutorials.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Tutorials +parent: Multimedia Content Delivery +has_children: true +nav_order: 4 +--- + +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. +* We are working on it... diff --git a/pages/xr-media-integration-in-5g/features.md b/pages/xr-media-integration-in-5g/features.md new file mode 100644 index 00000000..b8cedb9f --- /dev/null +++ b/pages/xr-media-integration-in-5g/features.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Features +parent: XR Media Integration in 5G +has_children: false +nav_order: 1 +--- + +# List of features under implementation diff --git a/pages/xr-media-integration-in-5g/index.md b/pages/xr-media-integration-in-5g/index.md index 320d7901..aaf705f3 100644 --- a/pages/xr-media-integration-in-5g/index.md +++ b/pages/xr-media-integration-in-5g/index.md @@ -2,44 +2,8 @@ layout: default title: XR Media Integration in 5G has_children: true +nav_order: 7 --- -# Implementing XR Media integration in 5G -Information about 3XR Media integration in 5G can be found at www.5g-mag.com/immersive -*** -## 📑 Specifications and architecture -* High-level architectures can be found [here](https://www.5g-mag.com/repositories#xr-media-5g) -*** - -## 🚧 On-going projects -Check the [Projects](https://github.com/5G-MAG/Getting-Started/wiki/XR-Media-integration-in-5G-Projects) under development for XR and Immersive Media -*** - -## ▶️ Using the tools -Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) and check the wikis below for more information -*Developers are working on it... stay tuned for news. -*** - -## ⭐ Related repositories -* Check the Repositories relevant to XR Media integration in 5G: Code, releases, packages, dockers, guidelines,... - Note that these repositories are currently private and under testing. Early access can be requested at: https://www.5g-mag.com/early-access - -### XR Unity Player: [rt-xr-unity-player](https://github.com/5G-MAG/rt-xr-unity-player) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-unity-player#readme) -* [Releases](https://github.com/5G-MAG/rt-xr-unity-player/releases) - -### XR Blender Exporter: [rt-xr-blender-exporter](https://github.com/5G-MAG/rt-xr-blender-exporter) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-blender-exporter#readme) -* [Releases](https://github.com/5G-MAG/rt-xr-blender-exporter/releases) - -### Efficient glTF 3D import / export package for Unity: [rt-xr-gITFast](https://github.com/5G-MAG/rt-xr-gITFast) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-gITFast#readme) -* [Releases](https://github.com/5G-MAG/rt-xr-gITFast/releases) - -### XR MAF Plugin: [rt-xr-maf-plugin](https://github.com/5G-MAG/rt-xr-maf-plugin) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-maf-plugin#readme) -* [Releases](https://github.com/5G-MAG/rt-xr-maf-plugin/releases) - -### XR MAF Native: [rt-xr-maf-native](https://github.com/5G-MAG/rt-xr-maf-native) -* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-maf-native#readme) -* [Releases](https://github.com/5G-MAG/rt-xr-maf-native/releases) +# XR Media integration in 5G + diff --git a/pages/xr-media-integration-in-5g/projects.md b/pages/xr-media-integration-in-5g/projects.md new file mode 100644 index 00000000..a20929ea --- /dev/null +++ b/pages/xr-media-integration-in-5g/projects.md @@ -0,0 +1,12 @@ +--- +layout: default +title: Projects +parent: XR Media Integration in 5G +has_children: false +nav_order: 2 +--- + +# 🚧 Related projects +## XR: Repositories with ISO/IEC 23090-14:2023 functionalities - Release 1.0.0 +All issues related to the release of version 1.0.0 of the XR repositories dealing with functionalities defined in ISO/IEC 23090-14 +* [Kanban board](https://github.com/orgs/5G-MAG/projects/22) diff --git a/pages/xr-media-integration-in-5g/repositories.md b/pages/xr-media-integration-in-5g/repositories.md new file mode 100644 index 00000000..e56e958c --- /dev/null +++ b/pages/xr-media-integration-in-5g/repositories.md @@ -0,0 +1,30 @@ +--- +layout: default +title: Repositories +parent: XR Media Integration in 5G +has_children: false +nav_order: 3 +--- + +# ⭐ Related repositories +Note that these repositories are currently private and under testing. Early access can be requested at: https://www.5g-mag.com/early-access + +## XR Unity Player: [rt-xr-unity-player](https://github.com/5G-MAG/rt-xr-unity-player) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-unity-player#readme) +* [Releases](https://github.com/5G-MAG/rt-xr-unity-player/releases) + +## XR Blender Exporter: [rt-xr-blender-exporter](https://github.com/5G-MAG/rt-xr-blender-exporter) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-blender-exporter#readme) +* [Releases](https://github.com/5G-MAG/rt-xr-blender-exporter/releases) + +## Efficient glTF 3D import / export package for Unity: [rt-xr-gITFast](https://github.com/5G-MAG/rt-xr-gITFast) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-gITFast#readme) +* [Releases](https://github.com/5G-MAG/rt-xr-gITFast/releases) + +## XR MAF Plugin: [rt-xr-maf-plugin](https://github.com/5G-MAG/rt-xr-maf-plugin) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-maf-plugin#readme) +* [Releases](https://github.com/5G-MAG/rt-xr-maf-plugin/releases) + +## XR MAF Native: [rt-xr-maf-native](https://github.com/5G-MAG/rt-xr-maf-native) +* [Information and how to download, build, install and run](https://github.com/5G-MAG/rt-xr-maf-native#readme) +* [Releases](https://github.com/5G-MAG/rt-xr-maf-native/releases) diff --git a/pages/xr-media-integration-in-5g/specifications.md b/pages/xr-media-integration-in-5g/specifications.md new file mode 100644 index 00000000..b8a5631c --- /dev/null +++ b/pages/xr-media-integration-in-5g/specifications.md @@ -0,0 +1,8 @@ +--- +layout: default +title: Specifications +parent: XR Media Integration in 5G +has_children: false +nav_order: 0 +--- +# 📑 Specifications and relevant references diff --git a/pages/xr-media-integration-in-5g/tutorials.md b/pages/xr-media-integration-in-5g/tutorials.md new file mode 100644 index 00000000..fbc7473f --- /dev/null +++ b/pages/xr-media-integration-in-5g/tutorials.md @@ -0,0 +1,11 @@ +--- +layout: default +title: Tutorials +parent: XR Media Integration in 5G +has_children: true +nav_order: 4 +--- + +# ▶️ Using the tools +Check the [TUTORIALS & DEVELOPER XCHANGES](https://www.5g-mag.com/tutorials) in the 5G-MAG website and the information below. +* We are working on it...