マルチコーデックサイマルキャストに対応
対応しました。
m122 ベースで作っているので、support/m122.6261 ブランチへのマージになります。
scripts/patchdev.py を使ってパッチ管理しているので、libwebrtc のソースファイルがほぼそのまま含まれています。
@voluntas メモ
マルチコーデックサイマルキャストの仕様は RFC 8853 に準拠しています。
a=ridにpt=で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 対応
パッチの内容、絶対に忘れるので、今のうちにメモ。
大まかな方針
- サイマルキャストの枠組みの中で、マルチコーデックサイマルキャストを実現する
- サイマルキャストを複数にするみたいなことはしない
- ペイロードタイプやコーデックが1個である前提で書かれているところを、複数扱えるようにしていく
大まかな処理の流れ
エンコーダが作られるまでの流れは以下の通り。
media/engine/webrtc_video_engine.ccのWebRtcVideoSendChannelmedia/engine/webrtc_video_engine.ccのWebRtcVideoSendChannel::WebRtcVideoSendStreamvideo/video_send_stream_impl.ccのVideoSendStreamImpl- エンコード部分は
video/video_stream_encoder.ccのVideoStreamEncoder- (VideoEncoderFacotry 経由で)
media/engine/simulcast_encoder_adapter.ccのSimulcastEncoderAdapter
- (VideoEncoderFacotry 経由で)
- RTP 送信部分は
call/rtp_video_sender.ccのRtpVideoSender
- エンコード部分は
このようになっていて、これらの全てのクラスが、ペイロードとコーデックが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 へのコメントとして書いていく。
macOS arm64 で動作を確認済み。
iOS も対応済との認識。
master ベースに直したので、master 向けに PR 出し直します。