Skip to content

Commit

Permalink
Merge branch 'release/2023.2.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
miosakuma committed Aug 29, 2023
2 parents 5b2d1fb + 8e9790c commit 90066cd
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 11 deletions.
17 changes: 17 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,23 @@

## develop

## 2023.2.0

- [UPDATE] システム条件を更新する
- Android Studio 2022.2.1 以降
- WebRTC SFU Sora 2023.1.0 以降
- @miosakuma
- [UPDATE] libwebrtc を 115.5790.8.0 に上げる
- @miosakuma
- [ADD] 転送フィルター機能を追加する
- @szktty
- [ADD] scalability mode に対応する
- VP9 / AV1 のサイマルキャストに対応可能になる
- @szktty
- [ADD] 映像コーデックパラメータを追加する
- `SoraMediaOption``videoVp9Params`, `videoAv1Params`, `videoH264Params` を追加する
- @miosakuma

## 2023.1.0

- [UPDATE] システム条件を更新する
Expand Down
17 changes: 14 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Sora Android SDK

[![Release](https://jitpack.io/v/shiguredo/sora-android-sdk.svg)](https://jitpack.io/#shiguredo/sora-android-sdk)
[![libwebrtc](https://img.shields.io/badge/libwebrtc-112.5615-blue.svg)](https://chromium.googlesource.com/external/webrtc/+/branch-heads/5615)
[![libwebrtc](https://img.shields.io/badge/libwebrtc-115.5790-blue.svg)](https://chromium.googlesource.com/external/webrtc/+/branch-heads/5790)
[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/shiguredo/sora-android-sdk.svg)](https://github.com/shiguredo/sora-android-sdk.svg)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)

Expand All @@ -21,8 +21,8 @@ Please read https://github.com/shiguredo/oss before use.
## システム条件

- Android 5 以降 (エミュレーターでの動作は保証しません)
- Android Studio 2022.1.1 以降
- WebRTC SFU Sora 2022.2.0 以降
- Android Studio 2022.2.1 以降
- WebRTC SFU Sora 2023.1.0 以降

## サンプル

Expand All @@ -33,6 +33,17 @@ Please read https://github.com/shiguredo/oss before use.

[Sora Android SDK ドキュメント](https://sora-android-sdk.shiguredo.jp/)

## 有償での優先実装が可能な機能一覧

**詳細は Discord またはメールにてお問い合わせください**

- オープンソースでの公開が前提
- 可能であれば企業名の公開
- 公開が難しい場合は `企業名非公開` と書かせていただきます

### 機能

- 音声出力先変更機能

## ライセンス

Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ apply plugin: 'org.jetbrains.dokka'

buildscript {
ext.kotlin_version = '1.8.10'
ext.libwebrtc_version = '112.5615.1.0'
ext.libwebrtc_version = '115.5790.8.0'

ext.dokka_version = '1.8.10'

Expand All @@ -18,7 +18,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:7.4.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}"
classpath 'org.ajoberstar.grgit:grgit-gradle:5.0.0'
classpath 'org.ajoberstar.grgit:grgit-gradle:5.2.0'

classpath "org.jetbrains.dokka:dokka-gradle-plugin:${dokka_version}"
classpath "com.github.ben-manes:gradle-versions-plugin:0.46.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import io.reactivex.schedulers.Schedulers
import jp.shiguredo.sora.sdk.BuildConfig
import jp.shiguredo.sora.sdk.channel.data.ChannelAttendeesCount
import jp.shiguredo.sora.sdk.channel.option.PeerConnectionOption
import jp.shiguredo.sora.sdk.channel.option.SoraForwardingFilterOption
import jp.shiguredo.sora.sdk.channel.option.SoraMediaOption
import jp.shiguredo.sora.sdk.channel.rtc.PeerChannel
import jp.shiguredo.sora.sdk.channel.rtc.PeerChannelImpl
Expand Down Expand Up @@ -67,6 +68,7 @@ import kotlin.concurrent.schedule
* @param ignoreDisconnectWebSocket connect メッセージに含める `ignore_disconnect_websocket`
* @param dataChannels connect メッセージに含める `data_channels`
* @param bundleId connect メッセージに含める `bundle_id`
* @param forwardingFilterOption 転送フィルター機能の設定
*/
class SoraMediaChannel @JvmOverloads constructor(
private val context: Context,
Expand All @@ -84,6 +86,7 @@ class SoraMediaChannel @JvmOverloads constructor(
ignoreDisconnectWebSocket: Boolean? = null,
dataChannels: List<Map<String, Any>>? = null,
private var bundleId: String? = null,
private val forwardingFilterOption: SoraForwardingFilterOption? = null,
) {
companion object {
private val TAG = SoraMediaChannel::class.simpleName
Expand Down Expand Up @@ -655,6 +658,9 @@ class SoraMediaChannel @JvmOverloads constructor(
|videoDecoderFactory = ${mediaOption.videoDecoderFactory}
|videoCodec = ${mediaOption.videoCodec}
|videoBitRate = ${mediaOption.videoBitrate}
|videoVp9Params = ${mediaOption.videoVp9Params}
|videoAv1Params = ${mediaOption.videoAv1Params}
|videoH264Params = ${mediaOption.videoH264Params}
|videoCapturer = ${mediaOption.videoCapturer}
|simulcastEnabled = ${mediaOption.simulcastEnabled}
|simulcastRid = ${mediaOption.simulcastRid}
Expand All @@ -665,6 +671,7 @@ class SoraMediaChannel @JvmOverloads constructor(
|clientId = ${this.clientId}
|bundleId = ${this.bundleId}
|signalingNotifyMetadata = ${this.signalingNotifyMetadata}
|forwardingFilter = ${this.forwardingFilterOption}
""".trimMargin()
)

Expand Down Expand Up @@ -773,7 +780,8 @@ class SoraMediaChannel @JvmOverloads constructor(
bundleId = bundleId,
signalingNotifyMetadata = signalingNotifyMetadata,
connectDataChannels = connectDataChannels,
redirect = redirectLocation != null
redirect = redirectLocation != null,
forwardingFilterOption = forwardingFilterOption
)
signaling!!.connect()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package jp.shiguredo.sora.sdk.channel.option

/**
* 転送フィルター機能の設定を表すクラスです。
*
* @param action フィルター適用時の挙動
* @param rules フィルターの適用ルール
*/
class SoraForwardingFilterOption(
val action: Action,
val rules: List<List<Rule>>
) {
/**
* フィルター適用時の挙動を表します。
*/
enum class Action {
/** block */
BLOCK,

/** allow */
ALLOW
}

/**
* フィルターの適用ルールを表します。
*
* @param field フィルター対象のフィールド
* @param operator フィルターの演算子
* @param values フィルターの値
*/
class Rule(
val field: Field,
val operator: Operator,
val values: List<String>
) {
/**
* フィルター対象のフィールドを表します。
*/
enum class Field {
/** connection_id */
CONNECTION_ID,

/** client_id */
CLIENT_ID,

/** kind */
KIND
}

/**
* フィルターの演算子を表します。
*/
enum class Operator {
/** is_in */
IS_IN,

/** is_not_in */
IS_NOT_IN
}
}

internal val signaling: Any
get() {
return mapOf(
"action" to action.name.lowercase(),
"rules" to rules.map { outerRule ->
outerRule.map { rule ->
mapOf(
"field" to rule.field.name.lowercase(),
"operator" to rule.operator.name.lowercase(),
"values" to rule.values
)
}
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,34 @@ class SoraMediaOption {
internal var videoDownstreamContext: EglBase.Context? = null
internal var videoUpstreamContext: EglBase.Context? = null

/**
* 映像コーデック.
*
* 未設定の場合、 Sora Android SDK は VP9 を設定します.
*/
var videoCodec = SoraVideoOption.Codec.VP9

/**
* 映像ビットレート.
*/
// videoBitRate が正しい綴りだが後方互換性を壊すほどではないので放置する
var videoBitrate: Int? = null

/**
* VP9 向け映像コーデックパラメーター.
*/
var videoVp9Params: Any? = null

/**
* AV1 向け映像コーデックパラメーター.
*/
var videoAv1Params: Any? = null

/**
* H.264 向け映像コーデックパラメーター.
*/
var videoH264Params: Any? = null

/**
* 映像の視聴を有効にします.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ class PeerChannelImpl(
offerEncoding.maxBitrate?.also { senderEncoding.maxBitrateBps = it }
offerEncoding.maxFramerate?.also { senderEncoding.maxFramerate = it }
offerEncoding.scaleResolutionDownBy?.also { senderEncoding.scaleResolutionDownBy = it }
offerEncoding.scalabilityMode?.also { senderEncoding.scalabilityMode = it }
}

// アプリケーションに一旦渡す, encodings は final なので参照渡しで変更してもらう
Expand All @@ -398,6 +399,7 @@ class PeerChannelImpl(
"rid=$rid, " +
"active=$active, " +
"scaleResolutionDownBy=$scaleResolutionDownBy, " +
"scalabilityMode=$scalabilityMode, " +
"maxFramerate=$maxFramerate, " +
"maxBitrateBps=$maxBitrateBps, " +
"ssrc=$ssrc"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package jp.shiguredo.sora.sdk.channel.signaling

import jp.shiguredo.sora.sdk.channel.option.SoraChannelRole
import jp.shiguredo.sora.sdk.channel.option.SoraForwardingFilterOption
import jp.shiguredo.sora.sdk.channel.option.SoraMediaOption
import jp.shiguredo.sora.sdk.channel.signaling.message.MessageConverter
import jp.shiguredo.sora.sdk.channel.signaling.message.NotificationMessage
Expand Down Expand Up @@ -67,6 +68,7 @@ class SignalingChannelImpl @JvmOverloads constructor(
private val signalingNotifyMetadata: Any? = null,
private val connectDataChannels: List<Map<String, Any>>? = null,
private val redirect: Boolean = false,
private val forwardingFilterOption: SoraForwardingFilterOption? = null,
) : SignalingChannel {

companion object {
Expand Down Expand Up @@ -257,7 +259,8 @@ class SignalingChannelImpl @JvmOverloads constructor(
bundleId = bundleId,
signalingNotifyMetadata = signalingNotifyMetadata,
dataChannels = connectDataChannels,
redirect = redirect
redirect = redirect,
forwardingFilterOption = forwardingFilterOption
)
it.send(message)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,16 @@ data class ConnectMessage(
@SerializedName("data_channels") val dataChannels: List<Map<String, Any>>? = null,
@SerializedName("audio_streaming_language_code")
val audioStreamingLanguageCode: String? = null,
@SerializedName("redirect") var redirect: Boolean? = null
@SerializedName("redirect") var redirect: Boolean? = null,
@SerializedName("forwarding_filter") val forwardingFilter: Any? = null
)

data class VideoSetting(
@SerializedName("codec_type") val codecType: String,
@SerializedName("bit_rate") var bitRate: Int? = null
@SerializedName("bit_rate") var bitRate: Int? = null,
@SerializedName("vp9_params") var vp9Params: Any? = null,
@SerializedName("av1_params") var av1Params: Any? = null,
@SerializedName("h264_params") var h264Params: Any? = null
)

data class AudioSetting(
Expand Down Expand Up @@ -89,7 +93,8 @@ data class Encoding(
@SerializedName("active") val active: Boolean?,
@SerializedName("maxBitrate") val maxBitrate: Int?,
@SerializedName("maxFramerate") val maxFramerate: Int?,
@SerializedName("scaleResolutionDownBy") val scaleResolutionDownBy: Double?
@SerializedName("scaleResolutionDownBy") val scaleResolutionDownBy: Double?,
@SerializedName("scalabilityMode") val scalabilityMode: String?
)

data class RedirectMessage(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package jp.shiguredo.sora.sdk.channel.signaling.message

import com.google.gson.Gson
import jp.shiguredo.sora.sdk.channel.option.SoraChannelRole
import jp.shiguredo.sora.sdk.channel.option.SoraForwardingFilterOption
import jp.shiguredo.sora.sdk.channel.option.SoraMediaOption
import jp.shiguredo.sora.sdk.error.SoraDisconnectReason
import jp.shiguredo.sora.sdk.util.SoraLogger
Expand Down Expand Up @@ -39,7 +40,8 @@ class MessageConverter {
bundleId: String? = null,
signalingNotifyMetadata: Any? = null,
dataChannels: List<Map<String, Any>>? = null,
redirect: Boolean = false
redirect: Boolean = false,
forwardingFilterOption: SoraForwardingFilterOption? = null,
): String {

val msg = ConnectMessage(
Expand All @@ -55,6 +57,7 @@ class MessageConverter {
bundleId = bundleId,
signalingNotifyMetadata = signalingNotifyMetadata,
audioStreamingLanguageCode = mediaOption.audioStreamingLanguageCode,
forwardingFilter = forwardingFilterOption?.signaling,
)

if (mediaOption.upstreamIsRequired) {
Expand All @@ -74,6 +77,9 @@ class MessageConverter {
if (mediaOption.videoUpstreamEnabled) {
val videoSetting = VideoSetting(mediaOption.videoCodec.toString())
mediaOption.videoBitrate?.let { videoSetting.bitRate = it }
mediaOption.videoVp9Params?.let { videoSetting.vp9Params = it }
mediaOption.videoAv1Params?.let { videoSetting.av1Params = it }
mediaOption.videoH264Params?.let { videoSetting.h264Params = it }
msg.video = videoSetting
} else {
msg.video = false
Expand Down

0 comments on commit 90066cd

Please sign in to comment.