# AGH SSM 2025 | WebRTC Lab 2
Celem labolatorium jest zapoznanie z podstawami działania przykładowego serwera multimedialnego SFU.
Plan działania:
1. Implementacja strony klienckiej prostego systemu wideokonferencyjnego.
1. Wprowadzenie do simulcastu.
1. Wpływ packet lossu na jakość transmisji.
## 0 | Przygotowanie
1. Włącz Ubuntu :)
2. Zainstaluj `npm`, przeklejając poniższy snippet do terminala
```shell
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source ~/.bashrc
nvm install stable
nvm use stable
```
3. Sklonuj repo https://tinyurl.com/aghssm
> a jeśli nie działa, to https://github.com/elixir-webrtc/agh-ssm-workshop
## 1 | Aplikacja do wideokonferencji na bazie Fishjam Cloud
[Fishjam Cloud](https://fishjam.io) to platforma Software-as-a-Service do budowania aplikacji korzystających z WebRTC, udostępniająca nam SFU oraz `TypeScript`owe *klienckie* SDK do łączenia się z nim.
Użyjemy właśnie tego klienckiego SDK, by zbudować prostą aplikację do wideokonferencji w stylu Google Meet. Nasi użytkownicy będą podłączać się do jednego wspólnego pokoju.
>Zazwyczaj podczas tworzenia takiej aplikacji wykorzystuje się także *serwerowe* SDK umożliwiające zarządzanie serwerem multimedialnym (tworzenie pokoi, generowanie peer tokenów, zmianę konfiguracji itp.).
>Wprowadzimy tu jednak pewne uproszczenie -- wykorzystamy udostępniane przez Fishjam Cloud [RESTowe API do developmentu/testowania](https://docs.fishjam.io/room-manager), które pozwala w prosty sposób tworzyć peer tokeny wywołując jeden request HTTP.
0. W sklonowanym repo:
- otwórz folder `lab2/`,
- usuń `package-lock.json`,
- pobierz i zainstaluj dependencje (`npm install`),
- uruchom development serwer (`npm run dev`),
- otwórz `http://localhost:5173` w przeglądarce Chromium.
1. Otwórz `script.ts` w ulubionym edytorze i zapoznaj się z jego treścią
2. Wykorzystując komentarze w kodzie i dokumentację:
- [Fishjam Client](https://fishjam-cloud.github.io/web-client-sdk/classes/_fishjam-cloud_ts-client.FishjamClient.html),
- [navigator.mediaDevices.getUserMedia](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#syntax),
- [HTMLMediaElement (localPlayer)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement),
- [MediaStream](https://developer.mozilla.org/en-US/docs/Web/API/MediaStream),
zaimplementuj brakujące części kodu, poczynając od `// TWOJA KOLEJ`.
Wykorzystaj funkcje pomocnicze :)
3. Odśwież stronę, wpisz nazwę użytkownika i wciśnij `Join room`.
Po zezwoleniu na dostęp do kamery dołączysz do pokoju z pozostałymi uczestnikami laboratorium.
## 2 | Simulcast
0. Korzystamy z chrome'a/chromium :)
1. Nie bawimy się packet-lossem i RTX na razie :)
2. Wejdź pod: https://bigfish.jellyfish.ovh
3. Po co nam simulcast - wspólny eksperyment.
4. Eksperymentuj z odbieraną jakością video. Jak zmieniają się następujące metryki i dlaczego:
1. videoBitrate
2. frameWidth, frameHeight
3. keyframesDecoded
4. pliCount
5. Prezentacja chrome://webrtc-internals strony nadającej.
6. Wejdź pod: chrome://webrtc-internals
7. Odpowiedz na następujące pytania:
1. Ile pozycji inbound-rtp widzisz?
2. Dlaczego tyle?
3. Jakie mają identyfikatory: ssrc i rid?
4. Co to oznacza? Co musi zachodzić po stronie serwera? Wskazówka: munging RTP.
8. Wejdź pod: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/config/simulcast.cc;l=79?q=simulcast.cc
9. Ile warstw simulcastu jesteśmy w stanie uzyskać startując z bazowej rozdzielczości 1280x720px?
## 3 | Packet loss
1. Wejdź pod https://bigfish.jellyfish.ovh
2. Wybierz najwyższą jakość.
3. Ustaw różne wartości packet-lossu (%): 1, 2, 5, 10, 20, 50
4. Przy jakiej wartości stream przestaje być płynny?
5. Które statystyki na to wskazują?
6. Dla wartości packet-lossu, dla której stream przestaje być płynny zmień jakość video na najniższą.
7. Czy płynność jest lepsza?
8. Dlaczego?
9. Otwórz wireshark i przefiltruj przychodzące wideo pakiety RTP:
```
udp && ip.src==65.109.153.64 && p_type==102
```
10. Co obserwujesz?
11. Przełącz jakość video na najwyższą.
12. Jak zmieniły się markery?
13. Wyłącz retransmisje (RTX).
14. Powtórz całe zadanie.
<!--
```shell
sudo apt update
sudo apt install iproute2
sudo tc qdisc add dev eth0 root netem loss 1%
``` -->
## 4 | Feedback :)
Dzięki za udział! Prosimy o wypełnienie [króciutkiej ankiety](https://forms.gle/tTAFfF3q9xLdSnkd7) po zajęciach