webrtc-build icon indicating copy to clipboard operation
webrtc-build copied to clipboard

マルチコーデックサイマルキャストに対応

Open melpon opened this issue 1 year ago • 3 comments

対応しました。

m122 ベースで作っているので、support/m122.6261 ブランチへのマージになります。

scripts/patchdev.py を使ってパッチ管理しているので、libwebrtc のソースファイルがほぼそのまま含まれています。


@voluntas メモ

マルチコーデックサイマルキャストの仕様は RFC 8853 に準拠しています。

  • a=ridpt=payload_type を指定可能にしています
  • Server Offer は a=rid に入ってきた pt を利用するようにしています

TODO

マージは Client Offer を実現してから

  • [x] Client Offer
  • [x] Server Offer (Sora)
  • [x] H.265 への対応
  • [x] pt に対応していない場合の挙動
  • [ ] リソース不足になった時の挙動
  • [x] iOS 対応
  • [x] Android 対応
  • [x] macOS 対応
  • [x] Ubuntu 対応
  • [ ] Windows 対応

melpon avatar Apr 01 '24 06:04 melpon

パッチの内容、絶対に忘れるので、今のうちにメモ。

大まかな方針

  • サイマルキャストの枠組みの中で、マルチコーデックサイマルキャストを実現する
  • サイマルキャストを複数にするみたいなことはしない
  • ペイロードタイプやコーデックが1個である前提で書かれているところを、複数扱えるようにしていく

大まかな処理の流れ

エンコーダが作られるまでの流れは以下の通り。

  • media/engine/webrtc_video_engine.ccWebRtcVideoSendChannel
    • media/engine/webrtc_video_engine.ccWebRtcVideoSendChannel::WebRtcVideoSendStream
      • video/video_send_stream_impl.ccVideoSendStreamImpl
        • エンコード部分は video/video_stream_encoder.ccVideoStreamEncoder
          • (VideoEncoderFacotry 経由で)media/engine/simulcast_encoder_adapter.ccSimulcastEncoderAdapter
        • RTP 送信部分は call/rtp_video_sender.ccRtpVideoSender

このようになっていて、これらの全てのクラスが、ペイロードとコーデックが1個である前提で書かれている ので、これらを全て複数のペイロードとコーデックを持つように変えていく。

あと、上記のクラスが共通して利用しているコンフィグとして以下の構造体があり、これらがペイロードとコーデックが1個しか持てないので、これらを複数持てるようにする。

  • call/rtp_config.h: RtpConfig の payload_type を payload_types に。RTX も複数持てるようにする
  • video/config/video_encoder_config.h: VideoEncoderConfig の codec_type → codec_types、video_format → video_formats、encoder_specific_settings も複数に
  • api/video_codecs/simulcast_stream.h: SimulcastStream に新しく SdpVideoFormat format を追加する。
    • これは api/video_codecs/video_codec.h で定義されている VideoCodec から SimulcastStream simulcastStream[kMaxSimulcastStreams]; として参照されている。これで複数フォーマットをサポートする。
    • なお、本来は VideoCodec の codecType を複数にする必要があるが、このクラスは VideoEncoder インターフェースが利用しているので、codecType の名前や型を変更すると、既存の VideoEncoder インターフェースを利用したクラスがコンパイルエラーになってしまう可能性があるので、codecType は変更しない。

「名前の変更によってコンパイルエラーになってしまったけど、あまり影響の無さそうな部分(ログとか統計とか)」に関しては、codec_types[0] のように、先頭のだけ取り出してコンパイルを通していく。

あとは、ひたすら複数扱えるように頑張って書いていくだけ。

細かいポイントは PR へのコメントとして書いていく。

melpon avatar Apr 01 '24 07:04 melpon

macOS arm64 で動作を確認済み。

voluntas avatar May 06 '24 08:05 voluntas

iOS も対応済との認識。

voluntas avatar Jul 01 '24 03:07 voluntas

master ベースに直したので、master 向けに PR 出し直します。

melpon avatar Jul 09 '24 07:07 melpon