# VP9 + SVC on native iOS (libmediasoupclient)

**URL:** <https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791>\
**Category:** mediasoup libraries\
**Created:** [January 16, 2024, 2:33am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791 "2024-01-16T02:33:50Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![fedulvtubudul](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/fedulvtubudul/32/1128_2.png) [@fedulvtubudul](https://mediasoup.discourse.group/u/fedulvtubudul)\
**Post date:** [January 16, 2024, 2:33am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/1 "2024-01-16T02:33:50Z")

</div>

We are considering to switch our product from VP8 with simulcast to VP9 with SVC. On the web application we’ve managed to implement this transition, but on native iOS client I struggle with creating SVC producer. The error I get in WebRTC logs is `Attempted to set RtpParameters scalabilityMode to an unsupported value for the current codecs.`

I’m using WebRTC m120 and libmediasoupclient 3.4.1 (with patches from `m112` branch and some custom patches).

When creating producer, I use next parameters (pseudocode):

```auto
encodings: [
  {
    "scaleResolutionDownBy": 1,
    "maxBitrateBps": 5_000_000,
    "scalabilityMode": "L3T3_KEY"
  }
]

codecOptions: {
  "profile-id": 0,
  "x-google-start-bitrate": 1000
}

codec: {
  "preferredPayloadType": 109,
  "mimeType": "video/VP9",
  "clockRate": 90000,
  "rtcpFeedback": [
    {
      "parameter": "",
      "type": "goog-remb"
    },
    {
      "parameter": "",
      "type": "transport-cc"
    },
    {
      "parameter": "fir",
      "type": "ccm"
    },
    {
      "parameter": "",
      "type": "nack"
    },
    {
      "parameter": "pli",
      "type": "nack"
    }
  ],
  "kind": "video",
  "parameters": {}
}
""

```

If I remove `scalabilityMode` parameter, producer starts normally and I can consume video.

Does anyone have a positive experience producing VP9 with SVC enabled from native iOS code?

---

<div class="post-metadata">

**Author:** ![copiltembel](https://avatars.discourse-cdn.com/v4/letter/c/e9a140/32.png) [@copiltembel](https://mediasoup.discourse.group/u/copiltembel)\
**Post date:** [January 16, 2024, 10:21am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/2 "2024-01-16T10:21:24Z")

</div>

> [@fedulvtubudul](#):
>
> I’m using WebRTC m120 and libmediasoupclient 3.4.1 (with patches from `m112` branch and some custom patches).

How about contributing this as a patch to libmediasoupclient?

---

<div class="post-metadata">

**Author:** ![fedulvtubudul](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/fedulvtubudul/32/1128_2.png) [@fedulvtubudul](https://mediasoup.discourse.group/u/fedulvtubudul)\
**Post date:** [January 17, 2024, 2:47am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/3 "2024-01-17T02:47:51Z")

</div>

> [@copiltembel](#):
>
> How about contributing this as a patch to libmediasoupclient?

I’ve sent pull requests almost 6 months ago, still waiting for reaction from maintainers 😅

> <https://github.com/versatica/libmediasoupclient/pull/164>
>
> Fixes #163

> <https://github.com/versatica/libmediasoupclient/pull/167>
>
> \`iceServerUris\` parameter parsing logic in \[\`UpdateIceServers\` method\](https://g…ithub.com/versatica/libmediasoupclient/blob/48768ba90dee235e045e8dfbf364365504e2c4ce/src/Handler.cpp#L113C20-L113C20) in its current state suggests that the parameter is an array of strings.
> 
> \[Documentation\](https://mediasoup.org/documentation/v3/libmediasoupclient/api/#Transport-UpdateIceServers) suggests that this parameter is an array of \[RTCIceServer\](https://w3c.github.io/webrtc-pc/#rtciceserver-dictionary) structures. TS implementation uses same structure as far as I can see.
> 
> I've had part of this changes in my fork for the last year, but now I've decided to make a PR, so I added relevant test case and made parsing logic more general to support everything documentation describes.

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [January 17, 2024, 4:01am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/4 "2024-01-17T04:01:35Z")

</div>

Sorry for the delay. We will check in a few weeks.

---

<div class="post-metadata">

**Author:** ![jmillan](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/jmillan/32/9_2.png) [@jmillan](https://mediasoup.discourse.group/u/jmillan)\
**Post date:** [January 17, 2024, 10:17am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/5 "2024-01-17T10:17:31Z")

</div>

PR has been reviewed and merged. @fedulvtubudul , apologies for the delay.

---

<div class="post-metadata">

**Author:** ![jmillan](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/jmillan/32/9_2.png) [@jmillan](https://mediasoup.discourse.group/u/jmillan)\
**Post date:** [January 17, 2024, 10:31am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/6 "2024-01-17T10:31:12Z")

</div>

> [@fedulvtubudul](#):
>
> I’m using WebRTC m120 and libmediasoupclient 3.4.1

We would be grateful if you could collaborate on moving to m120.

---

<div class="post-metadata">

**Author:** ![ea167](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ea167/32/404_2.png) [@ea167](https://mediasoup.discourse.group/u/ea167)\
**Post date:** [February 9, 2024, 10:47pm UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/7 "2024-02-09T22:47:55Z")

</div>

Hello Alexander,  
Just curious, did you try every possible value of `scalabilityMode` as referenced [by W3 here](https://www.w3.org/TR/webrtc-svc/#scalabilitymodes*) ?  
None of them work?  
(sorry no experience with iOS native code)

---

<div class="post-metadata">

**Author:** ![fedulvtubudul](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/fedulvtubudul/32/1128_2.png) [@fedulvtubudul](https://mediasoup.discourse.group/u/fedulvtubudul)\
**Post date:** [February 12, 2024, 7:59am UTC](https://mediasoup.discourse.group/t/vp9-svc-on-native-ios-libmediasoupclient/5791/8 "2024-02-12T07:59:14Z")

</div>

I’ve tried different modes, but none of them were recognized.

After debugging WebRTC Cpp-ObjC bindings I’ve discovered one of the problems with SVC support in objc\_video\_encoder\_factory.mm. I’ve made a [patch for that](https://github.com/VLprojects/mediasoup-client-swift/blob/30d41bfbe64ad102b510c89d004561c291805249/patches/objc_video_encoder_factory_mm.patch), which makes us a little closer to a working solution.

But even though I can create a producer now, and SVC modes are recognized as supported with this fix, we still didn’t manage to produce actual SVC stream from iPhone. After changing RTPSender parameters to let’s say L3T1 mode, I check actual sender parameters and its L1T2 or something like that. I had to switch to another tasks for couple of weeks now but will return to this SVC-related experiments. If I’ll find any working solution, I’ll drop a line here.
