# VideoEncoderFactory

VideoEncoderFactory は、 [SoraMediaOption.videoEncoderFactory](https://shiguredo.github.io/sora-android-sdk/sora-android-sdk/jp.shiguredo.sora.sdk.channel.option/-sora-media-option/video-encoder-factory.html)  で指定することができます。

> **注釈**
>
> VideoEncoderFactory は libwebrtc に定義された interface です。
>
> 参考リンク:

# VideoEncoderFactory を設定しない場合の挙動

VideoEncoderFactory を設定しない場合は、以下のように VideoEncoderFactory が決定されます (Sora Android SDK の持つ VideoEncoderFactory は internal なので SDK ユーザーが直接利用することはできません)。

- サイマルキャストが有効な場合- SimulcastVideoEncoderFactoryWrapper
- それ以外- SoraDefaultVideoEncoderFactory


# ソフトウェアエンコーダーの使用を強制する

Sora Android SDK ではデフォルトでハードウェアエンコーダーをメインに設定し、ソフトウェアエンコーダーをフォールバック先に指定します。

この挙動を変更してソフトウェアエンコーダーのみを利用するには [SoraMediaOption](https://shiguredo.github.io/sora-android-sdk/sora-android-sdk/jp.shiguredo.sora.sdk.channel.option/-sora-media-option/) の `softwareVideoEncoderOnly: Boolean`  に `true` を設定してください。デフォルト値は `false` です。

これにより、ハードウェアエンコーダーではなくソフトウェアエンコーダーを利用することができます。

> **注釈**
>
> videoEncoderFactory を設定している場合、softwareVideoEncoderOnly は無視されます。

```kotlin
val capturer = CameraCapturerFactory.create(this)

val option = SoraMediaOption().apply {

    // ソフトウェアエンコーダーのみを利用するように設定
    softwareVideoEncoderOnly = true

    // 映像、音声の送受信の設定
    enableVideoUpstream(capturer!!, egl.eglBaseContext)
    enableAudioUpstream()
    enableVideoDownstream()
    enableAudioDownstream()

    // 映像コーデックを指定
    videoCodec = SoraVideoOption.Codec.VP9
}
```

# VideoEncoderFactory の設定方法

Sora Android SDK は利用したい VideoEncoderFactory を指定できます。

実装例

```kotlin
val capturer = CameraCapturerFactory.create(this)

val option = SoraMediaOption().apply {

    // 独自のエンコーダー実装を利用するように設定する
    videoEncoderFactory = MyVideoEncoderFactory()

    // 映像、音声の送受信の設定
    enableVideoUpstream(capturer!!, egl.eglBaseContext)
    enableAudioUpstream()
    enableVideoDownstream()
    enableAudioDownstream()

    // 映像コーデックを指定
    videoCodec = SoraVideoOption.Codec.VP9
}
```

## org.webrtc.SoftwareVideoEncoderFactory を videoEncoderFactory に設定する際の注意

> **重要**
>
> ソフトウェアエンコーダーを利用したい場合は、まず [ソフトウェアエンコーダーの使用を強制する](video_encoder_factory.html#1e947c) を試してみることをおすすめします。

以下の実装例のように libwebrtc で提供されている、 org.webrtc.SoftwareVideoEncoderFactory を videoEncoderFactory に設定する場合は、
SoftwareVideoEncoderFactory をインスタンス化する前に `jingle_peerconnection_so` をロードしてください。

> **注釈**
>
> なぜ `jingle_peerconnection_so` をロードする必要があるのか
>
> SoftwareVideoEncoderFactory 生成時に JNI の nativeCreateFactory() を即時に呼び出すようになりました。
> そのため PeerConnectionFactory.initialize(...) より前に本クラスを生成すると、
> まだ `jingle_peerconnection_so` がロードされておらず JNI 解決に失敗し、
> 次の UnsatisfiedLinkError が発生します。
>
> `java.lang.UnsatisfiedLinkError: No implementation found for long org.webrtc.SoftwareVideoEncoderFactory.nativeCreateFactory()`
>
> そのため、System.loadLibrary("jingle_peerconnection_so") を先に呼んで明示的にロード
> しておく必要があります。
>
> この対応が必要になったのはこの commit 以降です。

実装例

```kotlin
val capturer = CameraCapturerFactory.create(this)

// jingle_peerconnection_so をロードしてから
// SoftwareVideoEncoderFactory を初期化しないと実行時に例外が起こります
try {
   System.loadLibrary("jingle_peerconnection_so")
} catch (e: UnsatisfiedLinkError) {
}

val option = SoraMediaOption().apply {

    // ソフトウェアエンコーダーを利用するように設定する
    videoEncoderFactory = SoftwareVideoEncoderFactory()

    // 映像、音声の送受信の設定
    enableVideoUpstream(capturer!!, egl.eglBaseContext)
    enableAudioUpstream()
    enableVideoDownstream()
    enableAudioDownstream()

    // 映像コーデックを指定
    videoCodec = SoraVideoOption.Codec.VP9
}
```



