Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] offer メッセージの simulcast を利用する #129

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from

Conversation

miosakuma
Copy link
Contributor

@miosakuma miosakuma commented Jul 19, 2024

動作するところまで確認したので相談の Draft PR です。

対応内容

simulcast について connect でクライアントから払い出した値を認証ウェブフックで 上書きしても
クライアントに反映されない不具合を修正した。
ユーザーから指定された simulcast を利用していたので offer メッセージから取得した simulcast を利用するように修正した。

相談内容

offer で取得した simulcast の値を EncoderFactory まで引き回すように各種引数を追加したが、この対応で問題ないか。
現在ユーザが設定した接続オプション(MediaOption) をそのままコア部分まで渡しているがそこから抜本的に変えた方がよいか。

修正経緯として、はじめは #93 にて MediaOption の simulcastEnabled を offer の値で上書きしていましたが、
ユーザが設定した接続オプションを SDK 側で書き換えるのはよくない、という指摘を受け、MediaOption を更新しない書き方で対応しています。
#93 (comment)

現在の接続の流れ

関係ない項目は割愛していますが、以下のような内容です。

  1. ユーザが MediaOption に接続オプションを設定(simulcast, role, proxy 設定など)
  2. ユーザは MediaOption を引数に SoraMediaChannel を作成する
  3. ユーザは SoraMediaChannel の connect() を呼ぶ
  4. SoraMediaChannel は接続開始までに必要な操作を行う
    1. SoraMediaChannel は connect を Sora に投げる
      • SDP 生成するために MediaOption を引数に PeerChannel を生成する
      • PeerChannle 生成時に MediaOption を引数に RTCComponentFactory が生成され Encoder を設定する
    2. SoraMediaChannel は offer 受信後 answer を生成し Sora に投げる
      • 通話に利用するために MediaOption を引数に PeerChannel を生成する
      • PeerChannle 生成時に MediaOption を引数に RTCComponentFactory が生成され Encoder を設定する
  5. Sora との接続が確立

修正後の接続の流れ

4 の処理について PeerChannel, RTCComponentFactory のコンストラクタ引数に simulcastEnabled を追加しています。

  1. ユーザが MediaOption に接続オプションを設定(simulcast, role, proxy 設定など)
  2. ユーザは MediaOption を引数に SoraMediaChannel を作成する
  3. ユーザは SoraMediaChannel の connect() を呼ぶ
  4. SoraMediaChannel は接続開始までに必要な操作を行う
    1. SoraMediaChannel は connect を Sora に投げる
      • SDP 生成するために MediaOption と simulcastEnabled を引数に PeerChannel を生成する
      • PeerChannle 生成時に MediaOption と simulcastEnabled を引数に RTCComponentFactory が生成され Encoder を設定する
    2. SoraMediaChannel は offer 受信後 answer を生成し Sora に投げる
      • 通話に利用するために MediaOption と simulcastEnabled を引数に PeerChannel を生成する
      • PeerChannle 生成時に MediaOption と simulcastEnabled を引数に RTCComponentFactory が生成され Encoder を設定する
  5. Sora との接続が確立

そもそも MediaOption が最後まで連携されるのはおかしい、MediaOption + simulcastEnabled の値を持った別の構造体を用意すべき、という意見もあるかなと思い、対応内容がこれでよかったかコメントをもらえるとうれしいです。


This pull request primarily focuses on adding simulcast support to the SoraMediaChannel and PeerChannelImpl classes in the sora-android-sdk project. The changes include adding a new simulcastEnabled parameter to several methods and classes, and replacing the use of mediaOption.simulcastEnabled with this new parameter.

Changes related to simulcastEnabled:

Changes related to OfferMessage:

@miosakuma miosakuma changed the title offer メッセージの Simulcast を利用する [WIP] offer メッセージの Simulcast を利用する Jul 19, 2024
@miosakuma miosakuma marked this pull request as ready for review July 19, 2024 10:41
@miosakuma miosakuma changed the title [WIP] offer メッセージの Simulcast を利用する [WIP] offer メッセージの simulcast を利用する Jul 19, 2024
@@ -79,6 +79,7 @@ class PeerChannelImpl(
private val appContext: Context,
private val networkConfig: PeerNetworkConfig,
private val mediaOption: SoraMediaOption,
private val simulcastEnabled: Boolean = false,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この simulcastEnabled が offer message から入ってきた値を表すのであれば、offerSimulcastEnabled という命名の方が良さそうに思いましたが、どうでしょうか?

offer message であることを意識した命名は、他の箇所にもあったのでリンク貼っておきます。

// DataChannel 経由のシグナリングが有効なら true
// Sora から渡された値 (= offer メッセージ) を参照して更新している
private var offerDataChannelSignaling: Boolean = false

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PeerChannel クラスは offer かどうかを意識する必要がないためこの名称にしています。
offer の値を渡すかどうかを判断するのは SoraMediaChannel クラスであるべきという考えです。

PeerChannel は以下リンクのように各所から必要な時に用途に応じて呼び出せるものだと考えています。

val clientOfferPeer = PeerChannelImpl(
appContext = context,
networkConfig = PeerNetworkConfig(
serverConfig = OfferConfig(
iceServers = emptyList(),
iceTransportPolicy = ""
),
mediaOption = mediaOption
),

offerDataChannelSignaling は SoraMediaChannel 内の変数なので名称を分けるのが正しいと思います。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます。変数の命名についての考え方は理解できました。

ちょっと上のコメントの補足をすると
僕が当初、「この simulcastEnabled が offer message から入ってきた値を表すのであれば」と書いたのは、この変数が offer message に含まれている simulcast の値以外が入ることを期待していないのではないか、と思ったからでした。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants