bitmovin-player-react-native 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,7 +20,7 @@ Pod::Spec.new do |s|
20
20
 
21
21
  s.swift_version = "5.10"
22
22
  s.dependency "React-Core"
23
- s.dependency "BitmovinPlayer", "3.77.0"
23
+ s.dependency "BitmovinPlayer", "3.78.0"
24
24
  s.ios.dependency "GoogleAds-IMA-iOS-SDK", "3.23.0"
25
25
  s.tvos.dependency "GoogleAds-IMA-tvOS-SDK", "4.13.0"
26
26
  end
@@ -105,6 +105,6 @@ dependencies {
105
105
  // Bitmovin
106
106
  implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.33.0'
107
107
  implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
108
- implementation 'com.bitmovin.player:player:3.91.0+jason'
109
- implementation 'com.bitmovin.player:player-media-session:3.91.0+jason'
108
+ implementation 'com.bitmovin.player:player:3.94.0+jason'
109
+ implementation 'com.bitmovin.player:player-media-session:3.94.0+jason'
110
110
  }
@@ -0,0 +1,23 @@
1
+ package com.bitmovin.player.reactnative
2
+
3
+ import com.bitmovin.player.api.DebugConfig
4
+ import com.facebook.react.bridge.*
5
+ import com.facebook.react.module.annotations.ReactModule
6
+
7
+ private const val MODULE_NAME = "DebugModule"
8
+
9
+ @ReactModule(name = MODULE_NAME)
10
+ class DebugModule(context: ReactApplicationContext) : BitmovinBaseModule(context) {
11
+ override fun getName() = MODULE_NAME
12
+
13
+ /**
14
+ * Enable/disable verbose logging for the console logger.
15
+ * @param enabled Whether to set verbose logging as enabled or disabled.
16
+ */
17
+ @ReactMethod
18
+ fun setDebugLoggingEnabled(enabled: Boolean, promise: Promise) {
19
+ promise.unit.resolveOnUiThread {
20
+ DebugConfig.isLoggingEnabled = enabled
21
+ }
22
+ }
23
+ }
@@ -1,5 +1,6 @@
1
1
  package com.bitmovin.player.reactnative
2
2
 
3
+ import android.util.Log
3
4
  import androidx.concurrent.futures.CallbackToFutureAdapter
4
5
  import androidx.concurrent.futures.CallbackToFutureAdapter.Completer
5
6
  import com.bitmovin.player.api.network.HttpRequest
@@ -14,6 +15,7 @@ import com.bitmovin.player.reactnative.converter.toJson
14
15
  import com.bitmovin.player.reactnative.converter.toNetworkConfig
15
16
  import com.facebook.react.bridge.*
16
17
  import com.facebook.react.module.annotations.ReactModule
18
+ import java.util.concurrent.ConcurrentHashMap
17
19
  import java.util.concurrent.Future
18
20
 
19
21
  private const val MODULE_NAME = "NetworkModule"
@@ -25,8 +27,9 @@ class NetworkModule(context: ReactApplicationContext) : BitmovinBaseModule(conte
25
27
  * In-memory mapping from `nativeId`s to `NetworkConfig` instances.
26
28
  */
27
29
  private val networkConfigs: Registry<NetworkConfig> = mutableMapOf()
28
- private val preprocessHttpRequestCompleters: MutableMap<String, Completer<HttpRequest>> = mutableMapOf()
29
- private val preprocessHttpResponseCompleters: MutableMap<String, Completer<HttpResponse>> = mutableMapOf()
30
+ private val preprocessHttpRequestCompleters = ConcurrentHashMap<String, Completer<HttpRequest>>()
31
+ private val preprocessHttpResponseCompleters = ConcurrentHashMap<String, Completer<HttpResponse>>()
32
+
30
33
  override fun getName() = MODULE_NAME
31
34
 
32
35
  fun getConfig(nativeId: NativeId?): NetworkConfig? = nativeId?.let { networkConfigs[it] }
@@ -94,9 +97,14 @@ class NetworkModule(context: ReactApplicationContext) : BitmovinBaseModule(conte
94
97
 
95
98
  @ReactMethod
96
99
  fun setPreprocessedHttpRequest(requestId: String, request: ReadableMap) {
97
- preprocessHttpRequestCompleters[requestId]?.set(request.toHttpRequest())
98
- preprocessHttpRequestCompleters.remove(requestId)
100
+ val completer = preprocessHttpRequestCompleters.remove(requestId)
101
+ if (completer == null) {
102
+ Log.e(MODULE_NAME, "Completer is null for requestId: $requestId, this can cause stuck network requests")
103
+ return
104
+ }
105
+ completer.set(request.toHttpRequest())
99
106
  }
107
+
100
108
  private fun preprocessHttpResponseFromJS(
101
109
  nativeId: NativeId,
102
110
  type: HttpRequestType,
@@ -248,7 +248,7 @@ class RNPlayerViewManager(private val context: ReactApplicationContext) : Simple
248
248
  val playbackConfig = playerConfig?.getMap("playbackConfig")
249
249
  val isPictureInPictureEnabled = view.config?.pictureInPictureConfig?.isEnabled == true ||
250
250
  playbackConfig?.getBooleanOrNull("isPictureInPictureEnabled") == true
251
- view.enableBackgroundPlayback = playbackConfig?.getBoolean("isBackgroundPlaybackEnabled") ?: false
251
+ view.enableBackgroundPlayback = playbackConfig?.getBooleanOrNull("isBackgroundPlaybackEnabled") == true
252
252
 
253
253
  val rnStyleConfigWrapper = playerConfig?.toRNStyleConfigWrapperFromPlayerConfig()
254
254
  val configuredPlayerViewConfig = view.config?.playerViewConfig ?: PlayerViewConfig()
@@ -30,6 +30,7 @@ class RNPlayerViewPackage : ReactPackage {
30
30
  BitmovinCastManagerModule(reactContext),
31
31
  BufferModule(reactContext),
32
32
  NetworkModule(reactContext),
33
+ DebugModule(reactContext),
33
34
  )
34
35
  }
35
36
 
@@ -6,6 +6,7 @@ import com.bitmovin.analytics.api.CustomData
6
6
  import com.bitmovin.analytics.api.DefaultMetadata
7
7
  import com.bitmovin.analytics.api.SourceMetadata
8
8
  import com.bitmovin.player.api.DeviceDescription.DeviceName
9
+ import com.bitmovin.player.api.ForceReuseVideoCodecReason
9
10
  import com.bitmovin.player.api.PlaybackConfig
10
11
  import com.bitmovin.player.api.PlayerConfig
11
12
  import com.bitmovin.player.api.TweaksConfig
@@ -167,6 +168,16 @@ fun ReadableMap.toStyleConfig(): StyleConfig = StyleConfig().apply {
167
168
  withString("scalingMode") { scalingMode = ScalingMode.valueOf(it) }
168
169
  }
169
170
 
171
+ /**
172
+ * Converts any JS string into an `ForceReuseVideoCodecReason` enum value.
173
+ */
174
+ private fun String.toForceReuseVideoCodecReason(): ForceReuseVideoCodecReason? = when (this) {
175
+ "ColorInfoMismatch" -> ForceReuseVideoCodecReason.ColorInfoMismatch
176
+ "MaxInputSizeExceeded" -> ForceReuseVideoCodecReason.MaxInputSizeExceeded
177
+ "MaxResolutionExceeded" -> ForceReuseVideoCodecReason.MaxResolutionExceeded
178
+ else -> null
179
+ }
180
+
170
181
  /**
171
182
  * Converts any JS object into a `TweaksConfig` object.
172
183
  */
@@ -189,6 +200,12 @@ fun ReadableMap.toTweaksConfig(): TweaksConfig = TweaksConfig().apply {
189
200
  withBoolean("useDrmSessionForClearSources") { useDrmSessionForClearSources = it }
190
201
  withBoolean("useFiletypeExtractorFallbackForHls") { useFiletypeExtractorFallbackForHls = it }
191
202
  withBoolean("preferSoftwareDecodingForAds") { preferSoftwareDecodingForAds = it }
203
+ withStringArray("forceReuseVideoCodecReasons") {
204
+ forceReuseVideoCodecReasons = it
205
+ .filterNotNull()
206
+ .mapNotNull(String::toForceReuseVideoCodecReason)
207
+ .toSet()
208
+ }
192
209
  }
193
210
 
194
211
  /**
@@ -4,6 +4,7 @@ import android.content.Intent
4
4
  import android.os.Binder
5
5
  import android.os.IBinder
6
6
  import com.bitmovin.player.api.Player
7
+ import com.bitmovin.player.api.media.session.ControllerInfo
7
8
  import com.bitmovin.player.api.media.session.MediaSession
8
9
  import com.bitmovin.player.api.media.session.MediaSessionService
9
10
 
@@ -29,7 +30,7 @@ class MediaSessionPlaybackService : MediaSessionService() {
29
30
  private val binder = ServiceBinder()
30
31
  private var mediaSession: MediaSession? = null
31
32
 
32
- override fun onGetSession(): MediaSession? = null
33
+ override fun onGetSession(controllerInfo: ControllerInfo) = null
33
34
 
34
35
  override fun onDestroy() {
35
36
  disconnectSession()
@@ -0,0 +1,7 @@
1
+ #import <React/RCTBridgeModule.h>
2
+
3
+ @interface RCT_EXTERN_REMAP_MODULE(DebugModule, DebugModule, NSObject)
4
+
5
+ RCT_EXTERN_METHOD(setDebugLoggingEnabled:(nonnull BOOL)enabled)
6
+
7
+ @end
@@ -0,0 +1,33 @@
1
+ import BitmovinPlayer
2
+
3
+ @objc(DebugModule)
4
+ public class DebugModule: NSObject, RCTBridgeModule {
5
+ // swiftlint:disable:next implicitly_unwrapped_optional
6
+ @objc public var bridge: RCTBridge!
7
+
8
+ // swiftlint:disable:next implicitly_unwrapped_optional
9
+ public static func moduleName() -> String! {
10
+ "DebugModule"
11
+ }
12
+
13
+ /// Module requires main thread initialization.
14
+ public static func requiresMainQueueSetup() -> Bool {
15
+ true
16
+ }
17
+
18
+ // swiftlint:disable:next implicitly_unwrapped_optional
19
+ public var methodQueue: DispatchQueue! {
20
+ bridge.uiManager.methodQueue
21
+ }
22
+ }
23
+
24
+ extension DebugModule {
25
+ /// Enable/disable verbose logging for the console logger.
26
+ /// - Parameter enabled: Whether to set verbose logging as enabled or disabled.
27
+ @objc(setDebugLoggingEnabled:)
28
+ func setDebugLoggingEnabled(enabled: Bool) {
29
+ bridge.uiManager.addUIBlock { [weak self] _, _ in
30
+ DebugConfig.logging.logger?.level = enabled ? .verbose : .warning
31
+ }
32
+ }
33
+ }
@@ -44,6 +44,7 @@ public class FullscreenHandlerModule: NSObject, RCTBridgeModule {
44
44
  fullscreenHandlers.removeValue(forKey: nativeId)
45
45
  }
46
46
 
47
+ @MainActor
47
48
  @objc(onFullscreenChanged:isFullscreenEnabled:)
48
49
  func onFullscreenChanged(_ nativeId: NativeId, isFullscreenEnabled: Bool) -> Any? {
49
50
  fullscreenHandlers[nativeId]?.isFullscreen = isFullscreenEnabled
@@ -51,12 +52,14 @@ public class FullscreenHandlerModule: NSObject, RCTBridgeModule {
51
52
  return nil
52
53
  }
53
54
 
55
+ @MainActor
54
56
  @objc(registerHandler:)
55
57
  func registerHandler(_ nativeId: NativeId) {
56
58
  guard fullscreenHandlers[nativeId] == nil else { return }
57
59
  fullscreenHandlers[nativeId] = FullscreenHandlerBridge(nativeId, bridge: bridge)
58
60
  }
59
61
 
62
+ @MainActor
60
63
  @objc(setIsFullscreenActive:isFullscreen:)
61
64
  func setIsFullscreenActive(_ nativeId: NativeId, isFullscreen: Bool) {
62
65
  fullscreenHandlers[nativeId]?.isFullscreen = isFullscreen
@@ -200,6 +200,7 @@ public class RNPlayerViewManager: RCTViewManager {
200
200
  bridge.module(for: FullscreenHandlerModule.self) as? FullscreenHandlerModule
201
201
  }
202
202
 
203
+ @MainActor
203
204
  private func maybeEmitPictureInPictureAvailabilityEvent(for view: RNPlayerView, previousState: Bool) {
204
205
  guard let playerView = view.playerView,
205
206
  playerView.isPictureInPictureAvailable != previousState else {
package/lib/index.d.mts CHANGED
@@ -2778,6 +2778,29 @@ declare enum UserInterfaceType {
2778
2778
  Subtitle = "Subtitle"
2779
2779
  }
2780
2780
 
2781
+ /**
2782
+ * When switching the video quality, the video decoder's configuration might change
2783
+ * as the player can't always know if the codec supports such configuration change, it destroys and recreates it.
2784
+ * This behaviour can cause brief black screens when switching between video qualities as codec recreation can be slow.
2785
+ *
2786
+ * If a codec is know to support a given configuration change without issues,
2787
+ * the configuration can be added to the `TweaksConfig.forceReuseVideoCodecReasons`
2788
+ * to always reuse the video codec and avoid the black screen.
2789
+ */
2790
+ declare enum ForceReuseVideoCodecReason {
2791
+ /**
2792
+ * The new video quality color information is not compatible.
2793
+ */
2794
+ ColorInfoMismatch = "ColorInfoMismatch",
2795
+ /**
2796
+ * The new video quality exceed the decoder's configured maximum sample size.
2797
+ */
2798
+ MaxInputSizeExceeded = "MaxInputSizeExceeded",
2799
+ /**
2800
+ * The new video quality exceed the decoder's configured maximum resolution.
2801
+ */
2802
+ MaxResolutionExceeded = "MaxResolutionExceeded"
2803
+ }
2781
2804
  /**
2782
2805
  * This configuration is used as an incubator for experimental features. Tweaks are not officially
2783
2806
  * supported and are not guaranteed to be stable, i.e. their naming, functionality and API can
@@ -2950,6 +2973,20 @@ interface TweaksConfig {
2950
2973
  * @platform iOS
2951
2974
  */
2952
2975
  updatesNowPlayingInfoCenter?: boolean;
2976
+ /**
2977
+ * When switching between video formats (eg: adapting between video qualities)
2978
+ * the codec might be recreated due to several reasons.
2979
+ * This behaviour can cause brief black screens when switching between video qualities as codec recreation can be
2980
+ * slow.
2981
+ *
2982
+ * If a device is know to support video format changes and keep the current decoder without issues,
2983
+ * this set can be filled with multiple `ForceReuseVideoCodecReason` and avoid the black screen.
2984
+ *
2985
+ * Default is `null` i.e not set
2986
+ *
2987
+ * @platform Android
2988
+ */
2989
+ forceReuseVideoCodecReasons?: Array<ForceReuseVideoCodecReason>;
2953
2990
  }
2954
2991
 
2955
2992
  /**
@@ -3996,4 +4033,50 @@ declare class Network extends NativeInstance<NetworkConfig> {
3996
4033
  onPreprocessHttpResponse: (responseId: string, type: HttpRequestType, response: HttpResponse) => void;
3997
4034
  }
3998
4035
 
3999
- export { Ad, AdBreak, AdBreakFinishedEvent, AdBreakStartedEvent, AdClickedEvent, AdConfig, AdData, AdErrorEvent, AdFinishedEvent, AdItem, AdManifestLoadEvent, AdManifestLoadedEvent, AdQuartile, AdQuartileEvent, AdScheduledEvent, AdSkippedEvent, AdSource, AdSourceType, AdStartedEvent, AdaptationConfig, AdvertisingConfig, AnalyticsApi, AnalyticsConfig, AudioAddedEvent, AudioChangedEvent, AudioRemovedEvent, AudioSession, AudioSessionCategory, AudioTrack, BasePlayerViewProps, BitmovinCastManager, BitmovinCastManagerOptions, BitmovinNativeOfflineEventData, BufferApi, BufferConfig, BufferLevel, BufferLevels, BufferMediaTypeConfig, BufferType, CastAvailableEvent, CastPausedEvent, CastPayload, CastPlaybackFinishedEvent, CastPlayingEvent, CastStartEvent, CastStartedEvent, CastStoppedEvent, CastTimeUpdatedEvent, CastWaitingForDeviceEvent, CueEnterEvent, CueExitEvent, CustomDataConfig, CustomMessageHandler, CustomMessageHandlerProps, CustomUi, DefaultMetadata, DestroyEvent, DownloadFinishedEvent, Drm, DrmConfig, ErrorEvent, Event, EventSource, FairplayConfig, FullscreenDisabledEvent, FullscreenEnabledEvent, FullscreenEnterEvent, FullscreenExitEvent, FullscreenHandler, HttpRequest, HttpRequestType, HttpResponse, LiveConfig, LoadingState, MediaControlConfig, MediaType, MutedEvent, Network, NetworkConfig, OfflineContentConfig, OfflineContentManager, OfflineContentManagerListener, OfflineContentOptionEntry, OfflineContentOptions, OfflineDownloadRequest, OfflineEvent, OfflineEventType, OfflineSourceOptions, OfflineState, OnCanceledEvent, OnCompletedEvent, OnDrmLicenseExpiredEvent, OnDrmLicenseUpdatedEvent, OnErrorEvent, OnOptionsAvailableEvent, OnProgressEvent, OnResumedEvent, OnSuspendedEvent, PausedEvent, PictureInPictureAvailabilityChangedEvent, PictureInPictureConfig, PictureInPictureEnterEvent, PictureInPictureEnteredEvent, PictureInPictureExitEvent, PictureInPictureExitedEvent, PlayEvent, PlaybackConfig, PlaybackFinishedEvent, PlaybackSpeedChangedEvent, Player, PlayerActiveEvent, PlayerConfig, PlayerErrorEvent, PlayerView, PlayerViewConfig, PlayerViewProps, PlayerWarningEvent, PlayingEvent, ReadyEvent, RemoteControlConfig, ScalingMode, SeekEvent, SeekPosition, SeekedEvent, SideLoadedSubtitleTrack, SmallScreenUi, Source, SourceConfig, SourceErrorEvent, SourceLoadEvent, SourceLoadedEvent, SourceMetadata, SourceOptions, SourceRemoteControlConfig, SourceType, SourceUnloadedEvent, SourceWarningEvent, StallEndedEvent, StallStartedEvent, StyleConfig, SubtitleAddedEvent, SubtitleChangedEvent, SubtitleFormat, SubtitleRemovedEvent, SubtitleTrack, Thumbnail, TimeChangedEvent, TimeShiftEvent, TimeShiftedEvent, TimelineReferencePoint, TvUi, TweaksConfig, UiConfig, UnmutedEvent, UserInterfaceType, Variant, VideoDownloadQualityChangedEvent, VideoPlaybackQualityChangedEvent, VideoQuality, WebUiConfig, WidevineConfig, usePlayer };
4036
+ /**
4037
+ * Global debug configuration for all Bitmovin components.
4038
+ */
4039
+ declare class DebugConfig {
4040
+ private static _isDebugEnabled;
4041
+ /**
4042
+ * Retrieves the current debug logging state.
4043
+ *
4044
+ * @returns `true` if debug logging is enabled, otherwise `false`.
4045
+ */
4046
+ static get isDebugLoggingEnabled(): boolean;
4047
+ /**
4048
+ * Enables or disables global debug logging for all Bitmovin components.
4049
+ *
4050
+ * Debug logging provides detailed information primarily for debugging purposes,
4051
+ * helping to diagnose problems and trace the flow of execution within the Player.
4052
+ *
4053
+ * ### Warning:
4054
+ * This option **should not be enabled in production** as it may log sensitive or confidential
4055
+ * information to the console.
4056
+ *
4057
+ * ## Platform-Specific Logging Behavior
4058
+ * ---
4059
+ * - **iOS:** logs are printed using `NSLog` at the verbose log level.
4060
+ * - **Android:** logs are printed using `android.util.Log` with the following tags:
4061
+ * - `BitmovinPlayer`
4062
+ * - `BitmovinPlayerView`
4063
+ * - `BitmovinOffline`
4064
+ * - `BitmovinSource`
4065
+ * - `BitmovinExoPlayer`
4066
+ *
4067
+ * ## Limitations
4068
+ * ---
4069
+ * **Android**
4070
+ * - This flag **must** be set **before** creating any Bitmovin component to take effect.
4071
+ *
4072
+ * ## Usage Notes
4073
+ * ---
4074
+ * - We recommend setting this flag during your app's initialization phase, such as in the
4075
+ * application's entry point (e.g. `App.tsx`).
4076
+ *
4077
+ * @defaultValue `false`
4078
+ */
4079
+ static setDebugLoggingEnabled(value: boolean): Promise<void>;
4080
+ }
4081
+
4082
+ export { Ad, AdBreak, AdBreakFinishedEvent, AdBreakStartedEvent, AdClickedEvent, AdConfig, AdData, AdErrorEvent, AdFinishedEvent, AdItem, AdManifestLoadEvent, AdManifestLoadedEvent, AdQuartile, AdQuartileEvent, AdScheduledEvent, AdSkippedEvent, AdSource, AdSourceType, AdStartedEvent, AdaptationConfig, AdvertisingConfig, AnalyticsApi, AnalyticsConfig, AudioAddedEvent, AudioChangedEvent, AudioRemovedEvent, AudioSession, AudioSessionCategory, AudioTrack, BasePlayerViewProps, BitmovinCastManager, BitmovinCastManagerOptions, BitmovinNativeOfflineEventData, BufferApi, BufferConfig, BufferLevel, BufferLevels, BufferMediaTypeConfig, BufferType, CastAvailableEvent, CastPausedEvent, CastPayload, CastPlaybackFinishedEvent, CastPlayingEvent, CastStartEvent, CastStartedEvent, CastStoppedEvent, CastTimeUpdatedEvent, CastWaitingForDeviceEvent, CueEnterEvent, CueExitEvent, CustomDataConfig, CustomMessageHandler, CustomMessageHandlerProps, CustomUi, DebugConfig, DefaultMetadata, DestroyEvent, DownloadFinishedEvent, Drm, DrmConfig, ErrorEvent, Event, EventSource, FairplayConfig, ForceReuseVideoCodecReason, FullscreenDisabledEvent, FullscreenEnabledEvent, FullscreenEnterEvent, FullscreenExitEvent, FullscreenHandler, HttpRequest, HttpRequestType, HttpResponse, LiveConfig, LoadingState, MediaControlConfig, MediaType, MutedEvent, Network, NetworkConfig, OfflineContentConfig, OfflineContentManager, OfflineContentManagerListener, OfflineContentOptionEntry, OfflineContentOptions, OfflineDownloadRequest, OfflineEvent, OfflineEventType, OfflineSourceOptions, OfflineState, OnCanceledEvent, OnCompletedEvent, OnDrmLicenseExpiredEvent, OnDrmLicenseUpdatedEvent, OnErrorEvent, OnOptionsAvailableEvent, OnProgressEvent, OnResumedEvent, OnSuspendedEvent, PausedEvent, PictureInPictureAvailabilityChangedEvent, PictureInPictureConfig, PictureInPictureEnterEvent, PictureInPictureEnteredEvent, PictureInPictureExitEvent, PictureInPictureExitedEvent, PlayEvent, PlaybackConfig, PlaybackFinishedEvent, PlaybackSpeedChangedEvent, Player, PlayerActiveEvent, PlayerConfig, PlayerErrorEvent, PlayerView, PlayerViewConfig, PlayerViewProps, PlayerWarningEvent, PlayingEvent, ReadyEvent, RemoteControlConfig, ScalingMode, SeekEvent, SeekPosition, SeekedEvent, SideLoadedSubtitleTrack, SmallScreenUi, Source, SourceConfig, SourceErrorEvent, SourceLoadEvent, SourceLoadedEvent, SourceMetadata, SourceOptions, SourceRemoteControlConfig, SourceType, SourceUnloadedEvent, SourceWarningEvent, StallEndedEvent, StallStartedEvent, StyleConfig, SubtitleAddedEvent, SubtitleChangedEvent, SubtitleFormat, SubtitleRemovedEvent, SubtitleTrack, Thumbnail, TimeChangedEvent, TimeShiftEvent, TimeShiftedEvent, TimelineReferencePoint, TvUi, TweaksConfig, UiConfig, UnmutedEvent, UserInterfaceType, Variant, VideoDownloadQualityChangedEvent, VideoPlaybackQualityChangedEvent, VideoQuality, WebUiConfig, WidevineConfig, usePlayer };
package/lib/index.d.ts CHANGED
@@ -2778,6 +2778,29 @@ declare enum UserInterfaceType {
2778
2778
  Subtitle = "Subtitle"
2779
2779
  }
2780
2780
 
2781
+ /**
2782
+ * When switching the video quality, the video decoder's configuration might change
2783
+ * as the player can't always know if the codec supports such configuration change, it destroys and recreates it.
2784
+ * This behaviour can cause brief black screens when switching between video qualities as codec recreation can be slow.
2785
+ *
2786
+ * If a codec is know to support a given configuration change without issues,
2787
+ * the configuration can be added to the `TweaksConfig.forceReuseVideoCodecReasons`
2788
+ * to always reuse the video codec and avoid the black screen.
2789
+ */
2790
+ declare enum ForceReuseVideoCodecReason {
2791
+ /**
2792
+ * The new video quality color information is not compatible.
2793
+ */
2794
+ ColorInfoMismatch = "ColorInfoMismatch",
2795
+ /**
2796
+ * The new video quality exceed the decoder's configured maximum sample size.
2797
+ */
2798
+ MaxInputSizeExceeded = "MaxInputSizeExceeded",
2799
+ /**
2800
+ * The new video quality exceed the decoder's configured maximum resolution.
2801
+ */
2802
+ MaxResolutionExceeded = "MaxResolutionExceeded"
2803
+ }
2781
2804
  /**
2782
2805
  * This configuration is used as an incubator for experimental features. Tweaks are not officially
2783
2806
  * supported and are not guaranteed to be stable, i.e. their naming, functionality and API can
@@ -2950,6 +2973,20 @@ interface TweaksConfig {
2950
2973
  * @platform iOS
2951
2974
  */
2952
2975
  updatesNowPlayingInfoCenter?: boolean;
2976
+ /**
2977
+ * When switching between video formats (eg: adapting between video qualities)
2978
+ * the codec might be recreated due to several reasons.
2979
+ * This behaviour can cause brief black screens when switching between video qualities as codec recreation can be
2980
+ * slow.
2981
+ *
2982
+ * If a device is know to support video format changes and keep the current decoder without issues,
2983
+ * this set can be filled with multiple `ForceReuseVideoCodecReason` and avoid the black screen.
2984
+ *
2985
+ * Default is `null` i.e not set
2986
+ *
2987
+ * @platform Android
2988
+ */
2989
+ forceReuseVideoCodecReasons?: Array<ForceReuseVideoCodecReason>;
2953
2990
  }
2954
2991
 
2955
2992
  /**
@@ -3996,4 +4033,50 @@ declare class Network extends NativeInstance<NetworkConfig> {
3996
4033
  onPreprocessHttpResponse: (responseId: string, type: HttpRequestType, response: HttpResponse) => void;
3997
4034
  }
3998
4035
 
3999
- export { Ad, AdBreak, AdBreakFinishedEvent, AdBreakStartedEvent, AdClickedEvent, AdConfig, AdData, AdErrorEvent, AdFinishedEvent, AdItem, AdManifestLoadEvent, AdManifestLoadedEvent, AdQuartile, AdQuartileEvent, AdScheduledEvent, AdSkippedEvent, AdSource, AdSourceType, AdStartedEvent, AdaptationConfig, AdvertisingConfig, AnalyticsApi, AnalyticsConfig, AudioAddedEvent, AudioChangedEvent, AudioRemovedEvent, AudioSession, AudioSessionCategory, AudioTrack, BasePlayerViewProps, BitmovinCastManager, BitmovinCastManagerOptions, BitmovinNativeOfflineEventData, BufferApi, BufferConfig, BufferLevel, BufferLevels, BufferMediaTypeConfig, BufferType, CastAvailableEvent, CastPausedEvent, CastPayload, CastPlaybackFinishedEvent, CastPlayingEvent, CastStartEvent, CastStartedEvent, CastStoppedEvent, CastTimeUpdatedEvent, CastWaitingForDeviceEvent, CueEnterEvent, CueExitEvent, CustomDataConfig, CustomMessageHandler, CustomMessageHandlerProps, CustomUi, DefaultMetadata, DestroyEvent, DownloadFinishedEvent, Drm, DrmConfig, ErrorEvent, Event, EventSource, FairplayConfig, FullscreenDisabledEvent, FullscreenEnabledEvent, FullscreenEnterEvent, FullscreenExitEvent, FullscreenHandler, HttpRequest, HttpRequestType, HttpResponse, LiveConfig, LoadingState, MediaControlConfig, MediaType, MutedEvent, Network, NetworkConfig, OfflineContentConfig, OfflineContentManager, OfflineContentManagerListener, OfflineContentOptionEntry, OfflineContentOptions, OfflineDownloadRequest, OfflineEvent, OfflineEventType, OfflineSourceOptions, OfflineState, OnCanceledEvent, OnCompletedEvent, OnDrmLicenseExpiredEvent, OnDrmLicenseUpdatedEvent, OnErrorEvent, OnOptionsAvailableEvent, OnProgressEvent, OnResumedEvent, OnSuspendedEvent, PausedEvent, PictureInPictureAvailabilityChangedEvent, PictureInPictureConfig, PictureInPictureEnterEvent, PictureInPictureEnteredEvent, PictureInPictureExitEvent, PictureInPictureExitedEvent, PlayEvent, PlaybackConfig, PlaybackFinishedEvent, PlaybackSpeedChangedEvent, Player, PlayerActiveEvent, PlayerConfig, PlayerErrorEvent, PlayerView, PlayerViewConfig, PlayerViewProps, PlayerWarningEvent, PlayingEvent, ReadyEvent, RemoteControlConfig, ScalingMode, SeekEvent, SeekPosition, SeekedEvent, SideLoadedSubtitleTrack, SmallScreenUi, Source, SourceConfig, SourceErrorEvent, SourceLoadEvent, SourceLoadedEvent, SourceMetadata, SourceOptions, SourceRemoteControlConfig, SourceType, SourceUnloadedEvent, SourceWarningEvent, StallEndedEvent, StallStartedEvent, StyleConfig, SubtitleAddedEvent, SubtitleChangedEvent, SubtitleFormat, SubtitleRemovedEvent, SubtitleTrack, Thumbnail, TimeChangedEvent, TimeShiftEvent, TimeShiftedEvent, TimelineReferencePoint, TvUi, TweaksConfig, UiConfig, UnmutedEvent, UserInterfaceType, Variant, VideoDownloadQualityChangedEvent, VideoPlaybackQualityChangedEvent, VideoQuality, WebUiConfig, WidevineConfig, usePlayer };
4036
+ /**
4037
+ * Global debug configuration for all Bitmovin components.
4038
+ */
4039
+ declare class DebugConfig {
4040
+ private static _isDebugEnabled;
4041
+ /**
4042
+ * Retrieves the current debug logging state.
4043
+ *
4044
+ * @returns `true` if debug logging is enabled, otherwise `false`.
4045
+ */
4046
+ static get isDebugLoggingEnabled(): boolean;
4047
+ /**
4048
+ * Enables or disables global debug logging for all Bitmovin components.
4049
+ *
4050
+ * Debug logging provides detailed information primarily for debugging purposes,
4051
+ * helping to diagnose problems and trace the flow of execution within the Player.
4052
+ *
4053
+ * ### Warning:
4054
+ * This option **should not be enabled in production** as it may log sensitive or confidential
4055
+ * information to the console.
4056
+ *
4057
+ * ## Platform-Specific Logging Behavior
4058
+ * ---
4059
+ * - **iOS:** logs are printed using `NSLog` at the verbose log level.
4060
+ * - **Android:** logs are printed using `android.util.Log` with the following tags:
4061
+ * - `BitmovinPlayer`
4062
+ * - `BitmovinPlayerView`
4063
+ * - `BitmovinOffline`
4064
+ * - `BitmovinSource`
4065
+ * - `BitmovinExoPlayer`
4066
+ *
4067
+ * ## Limitations
4068
+ * ---
4069
+ * **Android**
4070
+ * - This flag **must** be set **before** creating any Bitmovin component to take effect.
4071
+ *
4072
+ * ## Usage Notes
4073
+ * ---
4074
+ * - We recommend setting this flag during your app's initialization phase, such as in the
4075
+ * application's entry point (e.g. `App.tsx`).
4076
+ *
4077
+ * @defaultValue `false`
4078
+ */
4079
+ static setDebugLoggingEnabled(value: boolean): Promise<void>;
4080
+ }
4081
+
4082
+ export { Ad, AdBreak, AdBreakFinishedEvent, AdBreakStartedEvent, AdClickedEvent, AdConfig, AdData, AdErrorEvent, AdFinishedEvent, AdItem, AdManifestLoadEvent, AdManifestLoadedEvent, AdQuartile, AdQuartileEvent, AdScheduledEvent, AdSkippedEvent, AdSource, AdSourceType, AdStartedEvent, AdaptationConfig, AdvertisingConfig, AnalyticsApi, AnalyticsConfig, AudioAddedEvent, AudioChangedEvent, AudioRemovedEvent, AudioSession, AudioSessionCategory, AudioTrack, BasePlayerViewProps, BitmovinCastManager, BitmovinCastManagerOptions, BitmovinNativeOfflineEventData, BufferApi, BufferConfig, BufferLevel, BufferLevels, BufferMediaTypeConfig, BufferType, CastAvailableEvent, CastPausedEvent, CastPayload, CastPlaybackFinishedEvent, CastPlayingEvent, CastStartEvent, CastStartedEvent, CastStoppedEvent, CastTimeUpdatedEvent, CastWaitingForDeviceEvent, CueEnterEvent, CueExitEvent, CustomDataConfig, CustomMessageHandler, CustomMessageHandlerProps, CustomUi, DebugConfig, DefaultMetadata, DestroyEvent, DownloadFinishedEvent, Drm, DrmConfig, ErrorEvent, Event, EventSource, FairplayConfig, ForceReuseVideoCodecReason, FullscreenDisabledEvent, FullscreenEnabledEvent, FullscreenEnterEvent, FullscreenExitEvent, FullscreenHandler, HttpRequest, HttpRequestType, HttpResponse, LiveConfig, LoadingState, MediaControlConfig, MediaType, MutedEvent, Network, NetworkConfig, OfflineContentConfig, OfflineContentManager, OfflineContentManagerListener, OfflineContentOptionEntry, OfflineContentOptions, OfflineDownloadRequest, OfflineEvent, OfflineEventType, OfflineSourceOptions, OfflineState, OnCanceledEvent, OnCompletedEvent, OnDrmLicenseExpiredEvent, OnDrmLicenseUpdatedEvent, OnErrorEvent, OnOptionsAvailableEvent, OnProgressEvent, OnResumedEvent, OnSuspendedEvent, PausedEvent, PictureInPictureAvailabilityChangedEvent, PictureInPictureConfig, PictureInPictureEnterEvent, PictureInPictureEnteredEvent, PictureInPictureExitEvent, PictureInPictureExitedEvent, PlayEvent, PlaybackConfig, PlaybackFinishedEvent, PlaybackSpeedChangedEvent, Player, PlayerActiveEvent, PlayerConfig, PlayerErrorEvent, PlayerView, PlayerViewConfig, PlayerViewProps, PlayerWarningEvent, PlayingEvent, ReadyEvent, RemoteControlConfig, ScalingMode, SeekEvent, SeekPosition, SeekedEvent, SideLoadedSubtitleTrack, SmallScreenUi, Source, SourceConfig, SourceErrorEvent, SourceLoadEvent, SourceLoadedEvent, SourceMetadata, SourceOptions, SourceRemoteControlConfig, SourceType, SourceUnloadedEvent, SourceWarningEvent, StallEndedEvent, StallStartedEvent, StyleConfig, SubtitleAddedEvent, SubtitleChangedEvent, SubtitleFormat, SubtitleRemovedEvent, SubtitleTrack, Thumbnail, TimeChangedEvent, TimeShiftEvent, TimeShiftedEvent, TimelineReferencePoint, TvUi, TweaksConfig, UiConfig, UnmutedEvent, UserInterfaceType, Variant, VideoDownloadQualityChangedEvent, VideoPlaybackQualityChangedEvent, VideoQuality, WebUiConfig, WidevineConfig, usePlayer };
package/lib/index.js CHANGED
@@ -44,7 +44,9 @@ __export(src_exports, {
44
44
  BufferType: () => BufferType,
45
45
  CustomMessageHandler: () => CustomMessageHandler,
46
46
  CustomUi: () => CustomUi,
47
+ DebugConfig: () => DebugConfig,
47
48
  Drm: () => Drm,
49
+ ForceReuseVideoCodecReason: () => ForceReuseVideoCodecReason,
48
50
  HttpRequestType: () => HttpRequestType,
49
51
  LoadingState: () => LoadingState,
50
52
  MediaType: () => MediaType,
@@ -1713,6 +1715,66 @@ var BitmovinCastManager = {
1713
1715
  return BitmovinCastManagerModule.sendMessage(message, messageNamespace);
1714
1716
  }
1715
1717
  };
1718
+
1719
+ // src/tweaksConfig.ts
1720
+ var ForceReuseVideoCodecReason = /* @__PURE__ */ ((ForceReuseVideoCodecReason2) => {
1721
+ ForceReuseVideoCodecReason2["ColorInfoMismatch"] = "ColorInfoMismatch";
1722
+ ForceReuseVideoCodecReason2["MaxInputSizeExceeded"] = "MaxInputSizeExceeded";
1723
+ ForceReuseVideoCodecReason2["MaxResolutionExceeded"] = "MaxResolutionExceeded";
1724
+ return ForceReuseVideoCodecReason2;
1725
+ })(ForceReuseVideoCodecReason || {});
1726
+
1727
+ // src/debug.ts
1728
+ var import_react_native16 = require("react-native");
1729
+ var DebugModule = import_react_native16.NativeModules.DebugModule;
1730
+ var _DebugConfig = class _DebugConfig {
1731
+ /**
1732
+ * Retrieves the current debug logging state.
1733
+ *
1734
+ * @returns `true` if debug logging is enabled, otherwise `false`.
1735
+ */
1736
+ static get isDebugLoggingEnabled() {
1737
+ return _DebugConfig._isDebugEnabled;
1738
+ }
1739
+ /**
1740
+ * Enables or disables global debug logging for all Bitmovin components.
1741
+ *
1742
+ * Debug logging provides detailed information primarily for debugging purposes,
1743
+ * helping to diagnose problems and trace the flow of execution within the Player.
1744
+ *
1745
+ * ### Warning:
1746
+ * This option **should not be enabled in production** as it may log sensitive or confidential
1747
+ * information to the console.
1748
+ *
1749
+ * ## Platform-Specific Logging Behavior
1750
+ * ---
1751
+ * - **iOS:** logs are printed using `NSLog` at the verbose log level.
1752
+ * - **Android:** logs are printed using `android.util.Log` with the following tags:
1753
+ * - `BitmovinPlayer`
1754
+ * - `BitmovinPlayerView`
1755
+ * - `BitmovinOffline`
1756
+ * - `BitmovinSource`
1757
+ * - `BitmovinExoPlayer`
1758
+ *
1759
+ * ## Limitations
1760
+ * ---
1761
+ * **Android**
1762
+ * - This flag **must** be set **before** creating any Bitmovin component to take effect.
1763
+ *
1764
+ * ## Usage Notes
1765
+ * ---
1766
+ * - We recommend setting this flag during your app's initialization phase, such as in the
1767
+ * application's entry point (e.g. `App.tsx`).
1768
+ *
1769
+ * @defaultValue `false`
1770
+ */
1771
+ static async setDebugLoggingEnabled(value) {
1772
+ _DebugConfig._isDebugEnabled = value;
1773
+ await DebugModule.setDebugLoggingEnabled(value);
1774
+ }
1775
+ };
1776
+ __publicField(_DebugConfig, "_isDebugEnabled", false);
1777
+ var DebugConfig = _DebugConfig;
1716
1778
  // Annotate the CommonJS export names for ESM import in node:
1717
1779
  0 && (module.exports = {
1718
1780
  AdQuartile,
@@ -1724,7 +1786,9 @@ var BitmovinCastManager = {
1724
1786
  BufferType,
1725
1787
  CustomMessageHandler,
1726
1788
  CustomUi,
1789
+ DebugConfig,
1727
1790
  Drm,
1791
+ ForceReuseVideoCodecReason,
1728
1792
  HttpRequestType,
1729
1793
  LoadingState,
1730
1794
  MediaType,
package/lib/index.mjs CHANGED
@@ -1659,6 +1659,66 @@ var BitmovinCastManager = {
1659
1659
  return BitmovinCastManagerModule.sendMessage(message, messageNamespace);
1660
1660
  }
1661
1661
  };
1662
+
1663
+ // src/tweaksConfig.ts
1664
+ var ForceReuseVideoCodecReason = /* @__PURE__ */ ((ForceReuseVideoCodecReason2) => {
1665
+ ForceReuseVideoCodecReason2["ColorInfoMismatch"] = "ColorInfoMismatch";
1666
+ ForceReuseVideoCodecReason2["MaxInputSizeExceeded"] = "MaxInputSizeExceeded";
1667
+ ForceReuseVideoCodecReason2["MaxResolutionExceeded"] = "MaxResolutionExceeded";
1668
+ return ForceReuseVideoCodecReason2;
1669
+ })(ForceReuseVideoCodecReason || {});
1670
+
1671
+ // src/debug.ts
1672
+ import { NativeModules as NativeModules13 } from "react-native";
1673
+ var DebugModule = NativeModules13.DebugModule;
1674
+ var _DebugConfig = class _DebugConfig {
1675
+ /**
1676
+ * Retrieves the current debug logging state.
1677
+ *
1678
+ * @returns `true` if debug logging is enabled, otherwise `false`.
1679
+ */
1680
+ static get isDebugLoggingEnabled() {
1681
+ return _DebugConfig._isDebugEnabled;
1682
+ }
1683
+ /**
1684
+ * Enables or disables global debug logging for all Bitmovin components.
1685
+ *
1686
+ * Debug logging provides detailed information primarily for debugging purposes,
1687
+ * helping to diagnose problems and trace the flow of execution within the Player.
1688
+ *
1689
+ * ### Warning:
1690
+ * This option **should not be enabled in production** as it may log sensitive or confidential
1691
+ * information to the console.
1692
+ *
1693
+ * ## Platform-Specific Logging Behavior
1694
+ * ---
1695
+ * - **iOS:** logs are printed using `NSLog` at the verbose log level.
1696
+ * - **Android:** logs are printed using `android.util.Log` with the following tags:
1697
+ * - `BitmovinPlayer`
1698
+ * - `BitmovinPlayerView`
1699
+ * - `BitmovinOffline`
1700
+ * - `BitmovinSource`
1701
+ * - `BitmovinExoPlayer`
1702
+ *
1703
+ * ## Limitations
1704
+ * ---
1705
+ * **Android**
1706
+ * - This flag **must** be set **before** creating any Bitmovin component to take effect.
1707
+ *
1708
+ * ## Usage Notes
1709
+ * ---
1710
+ * - We recommend setting this flag during your app's initialization phase, such as in the
1711
+ * application's entry point (e.g. `App.tsx`).
1712
+ *
1713
+ * @defaultValue `false`
1714
+ */
1715
+ static async setDebugLoggingEnabled(value) {
1716
+ _DebugConfig._isDebugEnabled = value;
1717
+ await DebugModule.setDebugLoggingEnabled(value);
1718
+ }
1719
+ };
1720
+ __publicField(_DebugConfig, "_isDebugEnabled", false);
1721
+ var DebugConfig = _DebugConfig;
1662
1722
  export {
1663
1723
  AdQuartile,
1664
1724
  AdSourceType,
@@ -1669,7 +1729,9 @@ export {
1669
1729
  BufferType,
1670
1730
  CustomMessageHandler,
1671
1731
  CustomUi,
1732
+ DebugConfig,
1672
1733
  Drm,
1734
+ ForceReuseVideoCodecReason,
1673
1735
  HttpRequestType,
1674
1736
  LoadingState,
1675
1737
  MediaType,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bitmovin-player-react-native",
3
- "version": "0.31.0",
3
+ "version": "0.33.0",
4
4
  "description": "Official React Native bindings for Bitmovin's mobile Player SDKs.",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.mjs",
package/src/debug.ts ADDED
@@ -0,0 +1,56 @@
1
+ import { NativeModules } from 'react-native';
2
+
3
+ const DebugModule = NativeModules.DebugModule;
4
+
5
+ /**
6
+ * Global debug configuration for all Bitmovin components.
7
+ */
8
+ export class DebugConfig {
9
+ private static _isDebugEnabled = false;
10
+
11
+ /**
12
+ * Retrieves the current debug logging state.
13
+ *
14
+ * @returns `true` if debug logging is enabled, otherwise `false`.
15
+ */
16
+ static get isDebugLoggingEnabled(): boolean {
17
+ return DebugConfig._isDebugEnabled;
18
+ }
19
+
20
+ /**
21
+ * Enables or disables global debug logging for all Bitmovin components.
22
+ *
23
+ * Debug logging provides detailed information primarily for debugging purposes,
24
+ * helping to diagnose problems and trace the flow of execution within the Player.
25
+ *
26
+ * ### Warning:
27
+ * This option **should not be enabled in production** as it may log sensitive or confidential
28
+ * information to the console.
29
+ *
30
+ * ## Platform-Specific Logging Behavior
31
+ * ---
32
+ * - **iOS:** logs are printed using `NSLog` at the verbose log level.
33
+ * - **Android:** logs are printed using `android.util.Log` with the following tags:
34
+ * - `BitmovinPlayer`
35
+ * - `BitmovinPlayerView`
36
+ * - `BitmovinOffline`
37
+ * - `BitmovinSource`
38
+ * - `BitmovinExoPlayer`
39
+ *
40
+ * ## Limitations
41
+ * ---
42
+ * **Android**
43
+ * - This flag **must** be set **before** creating any Bitmovin component to take effect.
44
+ *
45
+ * ## Usage Notes
46
+ * ---
47
+ * - We recommend setting this flag during your app's initialization phase, such as in the
48
+ * application's entry point (e.g. `App.tsx`).
49
+ *
50
+ * @defaultValue `false`
51
+ */
52
+ static async setDebugLoggingEnabled(value: boolean): Promise<void> {
53
+ DebugConfig._isDebugEnabled = value;
54
+ await DebugModule.setDebugLoggingEnabled(value);
55
+ }
56
+ }
package/src/index.ts CHANGED
@@ -25,3 +25,4 @@ export * from './liveConfig';
25
25
  export * from './bufferApi';
26
26
  export * from './network';
27
27
  export * from './mediaControlConfig';
28
+ export * from './debug';
@@ -1,3 +1,27 @@
1
+ /**
2
+ * When switching the video quality, the video decoder's configuration might change
3
+ * as the player can't always know if the codec supports such configuration change, it destroys and recreates it.
4
+ * This behaviour can cause brief black screens when switching between video qualities as codec recreation can be slow.
5
+ *
6
+ * If a codec is know to support a given configuration change without issues,
7
+ * the configuration can be added to the `TweaksConfig.forceReuseVideoCodecReasons`
8
+ * to always reuse the video codec and avoid the black screen.
9
+ */
10
+ export enum ForceReuseVideoCodecReason {
11
+ /**
12
+ * The new video quality color information is not compatible.
13
+ */
14
+ ColorInfoMismatch = 'ColorInfoMismatch',
15
+ /**
16
+ * The new video quality exceed the decoder's configured maximum sample size.
17
+ */
18
+ MaxInputSizeExceeded = 'MaxInputSizeExceeded',
19
+ /**
20
+ * The new video quality exceed the decoder's configured maximum resolution.
21
+ */
22
+ MaxResolutionExceeded = 'MaxResolutionExceeded',
23
+ }
24
+
1
25
  /**
2
26
  * This configuration is used as an incubator for experimental features. Tweaks are not officially
3
27
  * supported and are not guaranteed to be stable, i.e. their naming, functionality and API can
@@ -170,4 +194,19 @@ export interface TweaksConfig {
170
194
  * @platform iOS
171
195
  */
172
196
  updatesNowPlayingInfoCenter?: boolean;
197
+
198
+ /**
199
+ * When switching between video formats (eg: adapting between video qualities)
200
+ * the codec might be recreated due to several reasons.
201
+ * This behaviour can cause brief black screens when switching between video qualities as codec recreation can be
202
+ * slow.
203
+ *
204
+ * If a device is know to support video format changes and keep the current decoder without issues,
205
+ * this set can be filled with multiple `ForceReuseVideoCodecReason` and avoid the black screen.
206
+ *
207
+ * Default is `null` i.e not set
208
+ *
209
+ * @platform Android
210
+ */
211
+ forceReuseVideoCodecReasons?: Array<ForceReuseVideoCodecReason>;
173
212
  }