diff --git a/CHANGELOG.md b/CHANGELOG.md
index 45f586a3..b717fa0c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,20 @@
## Changelog
-### Version 5.1.0-alpha6 [WIP]
+### Version 5.1.0-alpha9
+
+- Add ARM64 support for windows [#2137](https://github.com/react-native-community/react-native-video/pull/2137)
+- Fix deprecated API bug for windows [#2119](https://github.com/react-native-video/react-native-video/pull/2119)
+- Added `rate` property and autolinking support for windows [#2206](https://github.com/react-native-video/react-native-video/pull/2206)
+
+### Version 5.1.0-alpha8
+
+- Fixing ID3 Frame Error When Receiving EventMessage in TimedMetadata [#2116](https://github.com/react-native-community/react-native-video/pull/2116)
+
+### Version 5.1.0-alpha7
+
+- Basic support for DRM on iOS and Android [#1445](https://github.com/react-native-community/react-native-video/pull/1445)
+
+### Version 5.1.0-alpha6
- Fix iOS bug which would break size of views when video is displayed with controls on a non full-screen React view. [#1931](https://github.com/react-native-community/react-native-video/pull/1931)
- Fix video dimensions being undefined when playing HLS in ios. [#1992](https://github.com/react-native-community/react-native-video/pull/1992)
diff --git a/DRM.md b/DRM.md
new file mode 100644
index 00000000..d0ce88bf
--- /dev/null
+++ b/DRM.md
@@ -0,0 +1,139 @@
+# DRM
+
+## Provide DRM data (only tested with http/https assets)
+
+You can provide some configuration to allow DRM playback.
+This feature will disable the use of `TextureView` on Android.
+
+DRM object allows this members:
+
+| Property | Type | Default | Platform | Description |
+| --- | --- | --- | --- | --- |
+| [`type`](#type) | DRMType | undefined | iOS/Android | Specifies which type of DRM you are going to use, DRMType is an enum exposed on the JS module ('fairplay', 'playready', ...) |
+| [`licenseServer`](#licenseserver) | string | undefined | iOS/Android | Specifies the license server URL |
+| [`headers`](#headers) | Object | undefined | iOS/Android | Specifies the headers send to the license server URL on license acquisition |
+| [`contentId`](#contentid) | string | undefined | iOS | Specify the content id of the stream, otherwise it will take the host value from `loadingRequest.request.URL.host` (f.e: `skd://testAsset` -> will take `testAsset`) |
+| [`certificateUrl`](#certificateurl) | string | undefined | iOS | Specifies the url to obtain your ios certificate for fairplay, Url to the .cer file |
+| [`base64Certificate`](#base64certificate) | bool | false | iOS | Specifies whether or not the certificate returned by the `certificateUrl` is on base64 |
+| [`getLicense`](#getlicense)| function | undefined | iOS | Rather than setting the `licenseServer` url to get the license, you can manually get the license on the JS part, and send the result to the native part to configure FairplayDRM for the stream |
+
+### `base64Certificate`
+
+Whether or not the certificate url returns it on base64.
+
+Platforms: iOS
+
+### `certificateUrl`
+
+URL to fetch a valid certificate for FairPlay.
+
+Platforms: iOS
+
+### `getLicense`
+
+`licenseServer` and `headers` will be ignored. You will obtain as argument the `SPC` (as ASCII string, you will probably need to convert it to base 64) obtained from your `contentId` + the provided certificate via `[loadingRequest streamingContentKeyRequestDataForApp:certificateData contentIdentifier:contentIdData options:nil error:&spcError];`.
+ You should return on this method a `CKC` in Base64, either by just returning it or returning a `Promise` that resolves with the `CKC`.
+
+With this prop you can override the license acquisition flow, as an example:
+
+```js
+getLicense: (spcString) => {
+ const base64spc = Base64.encode(spcString);
+ const formData = new FormData();
+ formData.append('spc', base64spc);
+ return fetch(`https://license.pallycon.com/ri/licenseManager.do`, {
+ method: 'POST',
+ headers: {
+ 'pallycon-customdata-v2': 'd2VpcmRiYXNlNjRzdHJpbmcgOlAgRGFuaWVsIE1hcmnxbyB3YXMgaGVyZQ==',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ body: formData
+ }).then(response => response.text()).then((response) => {
+ return response;
+ }).catch((error) => {
+ console.error('Error', error);
+ });
+}
+```
+
+Platforms: iOS
+
+### `headers`
+
+You can customize headers send to the licenseServer.
+
+Example:
+
+```js
+source={{
+ uri: 'https://media.axprod.net/TestVectors/v7-MultiDRM-SingleKey/Manifest_1080p.mpd',
+}}
+drm={{
+ type: DRMType.WIDEVINE,
+ licenseServer: 'https://drm-widevine-licensing.axtest.net/AcquireLicense',
+ headers: {
+ 'X-AxDRM-Message': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2ZXJzaW9uIjoxLCJjb21fa2V5X2lkIjoiYjMzNjRlYjUtNTFmNi00YWUzLThjOTgtMzNjZWQ1ZTMxYzc4IiwibWVzc2FnZSI6eyJ0eXBlIjoiZW50aXRsZW1lbnRfbWVzc2FnZSIsImZpcnN0X3BsYXlfZXhwaXJhdGlvbiI6NjAsInBsYXlyZWFkeSI6eyJyZWFsX3RpbWVfZXhwaXJhdGlvbiI6dHJ1ZX0sImtleXMiOlt7ImlkIjoiOWViNDA1MGQtZTQ0Yi00ODAyLTkzMmUtMjdkNzUwODNlMjY2IiwiZW5jcnlwdGVkX2tleSI6ImxLM09qSExZVzI0Y3Iya3RSNzRmbnc9PSJ9XX19.FAbIiPxX8BHi9RwfzD7Yn-wugU19ghrkBFKsaCPrZmU'
+ },
+}}
+```
+
+### `licenseServer`
+
+The URL pointing to the licenseServer that will provide the authorization to play the protected stream.
+
+### `type`
+
+You can specify the DRM type, either by string or using the exported DRMType enum.
+Valid values are, for Android: DRMType.WIDEVINE / DRMType.PLAYREADY / DRMType.CLEARKEY.
+for iOS: DRMType.FAIRPLAY
+
+## Common Usage Scenarios
+
+### Send cookies to license server
+
+You can send Cookies to the license server via `headers` prop. Example:
+
+```js
+drm: {
+ type: DRMType.WIDEVINE
+ licenseServer: 'https://drm-widevine-licensing.axtest.net/AcquireLicense',
+ headers: {
+ 'Cookie': 'PHPSESSID=etcetc; csrftoken=mytoken; _gat=1; foo=bar'
+ },
+}
+```
+
+### Custom License Acquisition (only iOS for now)
+
+```js
+drm: {
+ type: DRMType.FAIRPLAY,
+ getLicense: (spcString) => {
+ const base64spc = Base64.encode(spcString);
+ return fetch('YOUR LICENSE SERVER HERE', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ },
+ body: JSON.stringify({
+ getFairplayLicense: {
+ foo: 'bar',
+ spcMessage: base64spc,
+ }
+ })
+ })
+ .then(response => response.json())
+ .then((response) => {
+ if (response && response.getFairplayLicenseResponse
+ && response.getFairplayLicenseResponse.ckcResponse) {
+ return response.getFairplayLicenseResponse.ckcResponse;
+ }
+ throw new Error('No correct response');
+ })
+ .catch((error) => {
+ console.error('CKC error', error);
+ });
+ }
+}
+```
diff --git a/DRMType.js b/DRMType.js
new file mode 100644
index 00000000..473536b2
--- /dev/null
+++ b/DRMType.js
@@ -0,0 +1,6 @@
+export default {
+ WIDEVINE: 'widevine',
+ PLAYREADY: 'playready',
+ CLEARKEY: 'clearkey',
+ FAIRPLAY: 'fairplay'
+};
diff --git a/README.md b/README.md
index 3e701aa7..0d30126b 100644
--- a/README.md
+++ b/README.md
@@ -117,8 +117,9 @@ Select RCTVideo-tvOS
### Android installation
Android details
-
-Run `react-native link react-native-video` to link the react-native-video library.
+
+Linking is not required in React Native 0.60 and above.
+If your project is using React Native < 0.60, run `react-native link react-native-video` to link the react-native-video library.
Or if you have trouble, make the following additions to the given files manually:
@@ -186,32 +187,46 @@ protected List getPackages() {
Windows RNW C++/WinRT details
+#### Autolinking
+
+**React Native Windows 0.63 and above**
+
+Autolinking should automatically add react-native-video to your app.
+
+#### Manual Linking
+
+**React Native Windows 0.62**
+
Make the following additions to the given files manually:
-#### **windows/myapp.sln**
+##### **windows\myapp.sln**
-Add the `ReactNativeVideoCPP` project to your solution.
+Add the _ReactNativeVideoCPP_ project to your solution (eg. `windows\myapp.sln`):
-1. Open the solution in Visual Studio 2019
-2. Right-click Solution icon in Solution Explorer > Add > Existing Project
- Select `node_modules\react-native-video\windows\ReactNativeVideoCPP\ReactNativeVideoCPP.vcxproj`
+1. Open your solution in Visual Studio 2019
+2. Right-click Solution icon in Solution Explorer > Add > Existing Project...
+3. Select `node_modules\react-native-video\windows\ReactNativeVideoCPP\ReactNativeVideoCPP.vcxproj`
-#### **windows/myapp/myapp.vcxproj**
+##### **windows\myapp\myapp.vcxproj**
-Add a reference to `ReactNativeVideoCPP` to your main application project. From Visual Studio 2019:
+Add a reference to _ReactNativeVideoCPP_ to your main application project (eg. `windows\myapp\myapp.vcxproj`):
-1. Right-click main application project > Add > Reference...
- Check `ReactNativeVideoCPP` from Solution Projects.
+1. Open your solution in Visual Studio 2019
+2. Right-click main application project > Add > Reference...
+3. Check _ReactNativeVideoCPP_ from Solution Projects
-2. Modify files below to add the video package providers to your main application project
-#### **pch.h**
+##### **pch.h**
Add `#include "winrt/ReactNativeVideoCPP.h"`.
-#### **app.cpp**
+##### **app.cpp**
Add `PackageProviders().Append(winrt::ReactNativeVideoCPP::ReactPackageProvider());` before `InitializeComponent();`.
+**React Native Windows 0.61 and below**
+
+Follow the manual linking instuctions for React Native Windows 0.62 above, but substitute _ReactNativeVideoCPP61_ for _ReactNativeVideoCPP_.
+
### react-native-dom installation
@@ -415,6 +430,11 @@ Determines whether video audio should override background music/audio in Android
Platforms: Android Exoplayer
+### DRM
+To setup DRM please follow [this guide](./DRM.md)
+
+Platforms: Android Exoplayer, iOS
+
#### filter
Add video filter
* **FilterType.NONE (default)** - No Filter
@@ -799,6 +819,17 @@ Note: Using this feature adding an entry for NSAppleMusicUsageDescription to you
Platforms: iOS
+##### Explicit mimetype for the stream
+
+Provide a member `type` with value (`mpd`/`m3u8`/`ism`) inside the source object.
+Sometimes is needed when URL extension does not match with the mimetype that you are expecting, as seen on the next example. (Extension is .ism -smooth streaming- but file served is on format mpd -mpeg dash-)
+
+Example:
+```
+source={{ uri: 'http://host-serving-a-type-different-than-the-extension.ism/manifest(format=mpd-time-csf)',
+type: 'mpd' }}
+```
+
###### Other protocols
The following other types are supported on some platforms, but aren't fully documented yet:
@@ -1285,7 +1316,7 @@ On iOS, if you would like to allow other apps to play music over your video comp
}
```
-You can also use the [ignoreSilentSwitch](ignoresilentswitch) prop.
+You can also use the [ignoreSilentSwitch](#ignoresilentswitch) prop.
### Android Expansion File Usage
diff --git a/Video.js b/Video.js
index 450a7796..b492d48b 100644
--- a/Video.js
+++ b/Video.js
@@ -4,6 +4,7 @@ import { StyleSheet, requireNativeComponent, NativeModules, View, ViewPropTypes,
import resolveAssetSource from 'react-native/Libraries/Image/resolveAssetSource';
import TextTrackType from './TextTrackType';
import FilterType from './FilterType';
+import DRMType from './DRMType';
import VideoResizeMode from './VideoResizeMode.js';
const styles = StyleSheet.create({
@@ -12,7 +13,7 @@ const styles = StyleSheet.create({
},
});
-export { TextTrackType, FilterType };
+export { TextTrackType, FilterType, DRMType };
export default class Video extends Component {
@@ -232,6 +233,26 @@ export default class Video extends Component {
}
};
+ _onGetLicense = (event) => {
+ if (this.props.drm && this.props.drm.getLicense instanceof Function) {
+ const data = event.nativeEvent;
+ if (data && data.spcBase64) {
+ const getLicenseOverride = this.props.drm.getLicense(data.spcBase64, data.contentId, data.licenseUrl);
+ const getLicensePromise = Promise.resolve(getLicenseOverride); // Handles both scenarios, getLicenseOverride being a promise and not.
+ getLicensePromise.then((result => {
+ if (result !== undefined) {
+ NativeModules.VideoManager.setLicenseResult(result, findNodeHandle(this._root));
+ } else {
+ NativeModules.VideoManager.setLicenseError && NativeModules.VideoManager.setLicenseError('Empty license result', findNodeHandle(this._root));
+ }
+ })).catch((error) => {
+ NativeModules.VideoManager.setLicenseError && NativeModules.VideoManager.setLicenseError(error, findNodeHandle(this._root));
+ });
+ } else {
+ NativeModules.VideoManager.setLicenseError && NativeModules.VideoManager.setLicenseError("No spc received", findNodeHandle(this._root));
+ }
+ }
+ }
getViewManagerConfig = viewManagerName => {
if (!NativeModules.UIManager.getViewManagerConfig) {
return NativeModules.UIManager[viewManagerName];
@@ -304,6 +325,7 @@ export default class Video extends Component {
onPlaybackRateChange: this._onPlaybackRateChange,
onAudioFocusChanged: this._onAudioFocusChanged,
onAudioBecomingNoisy: this._onAudioBecomingNoisy,
+ onGetLicense: nativeProps.drm && nativeProps.drm.getLicense && this._onGetLicense,
onPictureInPictureStatusChanged: this._onPictureInPictureStatusChanged,
onRestoreUserInterfaceForPictureInPictureStop: this._onRestoreUserInterfaceForPictureInPictureStop,
});
@@ -379,6 +401,16 @@ Video.propTypes = {
// Opaque type returned by require('./video.mp4')
PropTypes.number,
]),
+ drm: PropTypes.shape({
+ type: PropTypes.oneOf([
+ DRMType.CLEARKEY, DRMType.FAIRPLAY, DRMType.WIDEVINE, DRMType.PLAYREADY
+ ]),
+ licenseServer: PropTypes.string,
+ headers: PropTypes.shape({}),
+ base64Certificate: PropTypes.bool,
+ certificateUrl: PropTypes.string,
+ getLicense: PropTypes.func,
+ }),
minLoadRetryCount: PropTypes.number,
maxBitRate: PropTypes.number,
resizeMode: PropTypes.string,
diff --git a/android-exoplayer/build.gradle b/android-exoplayer/build.gradle
index 44918610..8ebe1d25 100644
--- a/android-exoplayer/build.gradle
+++ b/android-exoplayer/build.gradle
@@ -19,6 +19,11 @@ android {
versionCode 1
versionName "1.0"
}
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
}
dependencies {
@@ -35,6 +40,6 @@ dependencies {
implementation('com.google.android.exoplayer:extension-okhttp:2.11.4') {
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
}
- implementation 'com.squareup.okhttp3:okhttp:3.14.3'
+ implementation 'com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}'
}
diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java
index 487efeb0..19dda002 100644
--- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java
+++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java
@@ -22,6 +22,7 @@ public class DataSourceUtil {
private static DataSource.Factory rawDataSourceFactory = null;
private static DataSource.Factory defaultDataSourceFactory = null;
+ private static HttpDataSource.Factory defaultHttpDataSourceFactory = null;
private static String userAgent = null;
public static void setUserAgent(String userAgent) {
@@ -58,6 +59,17 @@ public class DataSourceUtil {
DataSourceUtil.defaultDataSourceFactory = factory;
}
+ public static HttpDataSource.Factory getDefaultHttpDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map requestHeaders) {
+ if (defaultHttpDataSourceFactory == null || (requestHeaders != null && !requestHeaders.isEmpty())) {
+ defaultHttpDataSourceFactory = buildHttpDataSourceFactory(context, bandwidthMeter, requestHeaders);
+ }
+ return defaultHttpDataSourceFactory;
+ }
+
+ public static void setDefaultHttpDataSourceFactory(HttpDataSource.Factory factory) {
+ DataSourceUtil.defaultHttpDataSourceFactory = factory;
+ }
+
private static DataSource.Factory buildRawDataSourceFactory(ReactContext context) {
return new RawResourceDataSourceFactory(context.getApplicationContext());
}
diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
index 83d70361..6823bc33 100644
--- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
+++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
@@ -35,6 +35,13 @@ import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Timeline;
+import com.google.android.exoplayer2.drm.DefaultDrmSessionManager;
+import com.google.android.exoplayer2.drm.DefaultDrmSessionEventListener;
+import com.google.android.exoplayer2.drm.DrmSessionManager;
+import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
+import com.google.android.exoplayer2.drm.FrameworkMediaDrm;
+import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
+import com.google.android.exoplayer2.drm.UnsupportedDrmException;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
import com.google.android.exoplayer2.metadata.Metadata;
@@ -70,6 +77,7 @@ import java.net.CookiePolicy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
+import java.util.UUID;
import java.util.Map;
@SuppressLint("ViewConstructor")
@@ -79,7 +87,8 @@ class ReactExoplayerView extends FrameLayout implements
BandwidthMeter.EventListener,
BecomingNoisyListener,
AudioManager.OnAudioFocusChangeListener,
- MetadataOutput {
+ MetadataOutput,
+ DefaultDrmSessionEventListener {
private static final String TAG = "ReactExoplayerView";
@@ -131,6 +140,8 @@ class ReactExoplayerView extends FrameLayout implements
private int bufferForPlaybackMs = DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS;
private int bufferForPlaybackAfterRebufferMs = DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS;
+ private Handler mainHandler;
+
// Props from React
private Uri srcUri;
private String extension;
@@ -148,6 +159,9 @@ class ReactExoplayerView extends FrameLayout implements
private boolean playInBackground = false;
private Map requestHeaders;
private boolean mReportBandwidth = false;
+ private UUID drmUUID = null;
+ private String drmLicenseUrl = null;
+ private String[] drmLicenseHeader = null;
private boolean controls;
// \ End props
@@ -195,8 +209,6 @@ class ReactExoplayerView extends FrameLayout implements
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(themedReactContext);
-
- initializePlayer();
}
@@ -220,6 +232,8 @@ class ReactExoplayerView extends FrameLayout implements
exoPlayerView.setLayoutParams(layoutParams);
addView(exoPlayerView, 0, layoutParams);
+
+ mainHandler = new Handler();
}
@Override
@@ -444,9 +458,23 @@ class ReactExoplayerView extends FrameLayout implements
DefaultRenderersFactory renderersFactory =
new DefaultRenderersFactory(getContext())
.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF);
- // TODO: Add drmSessionManager to 5th param from: https://github.com/react-native-community/react-native-video/pull/1445
+ // DRM
+ DrmSessionManager drmSessionManager = null;
+ if (self.drmUUID != null) {
+ try {
+ drmSessionManager = buildDrmSessionManager(self.drmUUID, self.drmLicenseUrl,
+ self.drmLicenseHeader);
+ } catch (UnsupportedDrmException e) {
+ int errorStringId = Util.SDK_INT < 18 ? R.string.error_drm_not_supported
+ : (e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME
+ ? R.string.error_drm_unsupported_scheme : R.string.error_drm_unknown);
+ eventEmitter.error(getResources().getString(errorStringId), e);
+ return;
+ }
+ }
+ // End DRM
player = ExoPlayerFactory.newSimpleInstance(getContext(), renderersFactory,
- trackSelector, defaultLoadControl, null, bandwidthMeter);
+ trackSelector, defaultLoadControl, drmSessionManager, bandwidthMeter);
player.addListener(self);
player.addMetadataOutput(self);
exoPlayerView.setPlayer(player);
@@ -493,6 +521,23 @@ class ReactExoplayerView extends FrameLayout implements
}, 1);
}
+ private DrmSessionManager buildDrmSessionManager(UUID uuid,
+ String licenseUrl, String[] keyRequestPropertiesArray) throws UnsupportedDrmException {
+ if (Util.SDK_INT < 18) {
+ return null;
+ }
+ HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl,
+ buildHttpDataSourceFactory(false));
+ if (keyRequestPropertiesArray != null) {
+ for (int i = 0; i < keyRequestPropertiesArray.length - 1; i += 2) {
+ drmCallback.setKeyRequestProperty(keyRequestPropertiesArray[i],
+ keyRequestPropertiesArray[i + 1]);
+ }
+ }
+ return new DefaultDrmSessionManager<>(uuid,
+ FrameworkMediaDrm.newInstance(uuid), drmCallback, null, false, 3);
+ }
+
private MediaSource buildMediaSource(Uri uri, String overrideExtension) {
int type = Util.inferContentType(!TextUtils.isEmpty(overrideExtension) ? "." + overrideExtension
: uri.getLastPathSegment());
@@ -661,6 +706,18 @@ class ReactExoplayerView extends FrameLayout implements
useBandwidthMeter ? bandwidthMeter : null, requestHeaders);
}
+ /**
+ * Returns a new HttpDataSource factory.
+ *
+ * @param useBandwidthMeter Whether to set {@link #bandwidthMeter} as a listener to the new
+ * DataSource factory.
+ * @return A new HttpDataSource factory.
+ */
+ private HttpDataSource.Factory buildHttpDataSourceFactory(boolean useBandwidthMeter) {
+ return DataSourceUtil.getDefaultHttpDataSourceFactory(this.themedReactContext, useBandwidthMeter ? bandwidthMeter : null, requestHeaders);
+ }
+
+
// AudioManager.OnAudioFocusChangeListener implementation
@Override
@@ -970,10 +1027,12 @@ class ReactExoplayerView extends FrameLayout implements
}
public int getTrackRendererIndex(int trackType) {
- int rendererCount = player.getRendererCount();
- for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) {
- if (player.getRendererType(rendererIndex) == trackType) {
- return rendererIndex;
+ if (player != null) {
+ int rendererCount = player.getRendererCount();
+ for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) {
+ if (player.getRendererType(rendererIndex) == trackType) {
+ return rendererIndex;
+ }
}
}
return C.INDEX_UNSET;
@@ -1228,12 +1287,12 @@ class ReactExoplayerView extends FrameLayout implements
}
public void setRateModifier(float newRate) {
- rate = newRate;
+ rate = newRate;
- if (player != null) {
- PlaybackParameters params = new PlaybackParameters(rate, 1f);
- player.setPlaybackParameters(params);
- }
+ if (player != null) {
+ PlaybackParameters params = new PlaybackParameters(rate, 1f);
+ player.setPlaybackParameters(params);
+ }
}
public void setMaxBitRateModifier(int newMaxBitRate) {
@@ -1281,7 +1340,8 @@ class ReactExoplayerView extends FrameLayout implements
}
public void setUseTextureView(boolean useTextureView) {
- exoPlayerView.setUseTextureView(useTextureView);
+ boolean finallyUseTextureView = useTextureView && this.drmUUID == null;
+ exoPlayerView.setUseTextureView(finallyUseTextureView);
}
public void setHideShutterView(boolean hideShutterView) {
@@ -1297,6 +1357,40 @@ class ReactExoplayerView extends FrameLayout implements
initializePlayer();
}
+ public void setDrmType(UUID drmType) {
+ this.drmUUID = drmType;
+ }
+
+ public void setDrmLicenseUrl(String licenseUrl){
+ this.drmLicenseUrl = licenseUrl;
+ }
+
+ public void setDrmLicenseHeader(String[] header){
+ this.drmLicenseHeader = header;
+ }
+
+
+ @Override
+ public void onDrmKeysLoaded() {
+ Log.d("DRM Info", "onDrmKeysLoaded");
+ }
+
+ @Override
+ public void onDrmSessionManagerError(Exception e) {
+ Log.d("DRM Info", "onDrmSessionManagerError");
+ eventEmitter.error("onDrmSessionManagerError", e);
+ }
+
+ @Override
+ public void onDrmKeysRestored() {
+ Log.d("DRM Info", "onDrmKeysRestored");
+ }
+
+ @Override
+ public void onDrmKeysRemoved() {
+ Log.d("DRM Info", "onDrmKeysRemoved");
+ }
+
/**
* Handling controls prop
*
diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java
index d520970d..7980e66e 100644
--- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java
+++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java
@@ -3,19 +3,25 @@ package com.brentvatne.exoplayer;
import android.content.Context;
import android.net.Uri;
import android.text.TextUtils;
+import android.util.Log;
import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.bridge.ReadableMapKeySetIterator;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;
+import com.facebook.react.bridge.ReactMethod;
+import com.google.android.exoplayer2.util.Util;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.upstream.RawResourceDataSource;
import java.util.HashMap;
+import java.util.ArrayList;
import java.util.Map;
+import java.util.UUID;
import javax.annotation.Nullable;
@@ -26,6 +32,10 @@ public class ReactExoplayerViewManager extends ViewGroupManager drmKeyRequestPropertiesList = new ArrayList<>();
+ ReadableMapKeySetIterator itr = drmHeaders.keySetIterator();
+ while (itr.hasNextKey()) {
+ String key = itr.nextKey();
+ drmKeyRequestPropertiesList.add(key);
+ drmKeyRequestPropertiesList.add(drmHeaders.getString(key));
+ }
+ videoView.setDrmLicenseHeader(drmKeyRequestPropertiesList.toArray(new String[0]));
+ }
+ videoView.setUseTextureView(false);
+ }
+ }
+ }
+
@ReactProp(name = PROP_SRC)
public void setSrc(final ReactExoplayerView videoView, @Nullable ReadableMap src) {
Context context = videoView.getContext().getApplicationContext();
@@ -109,7 +144,6 @@ public class ReactExoplayerViewManager extends ViewGroupManager headers = src.hasKey(PROP_SRC_HEADERS) ? toStringMap(src.getMap(PROP_SRC_HEADERS)) : null;
-
if (TextUtils.isEmpty(uriString)) {
return;
}
diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/VideoEventEmitter.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/VideoEventEmitter.java
index 7a60096a..ea0cc5ac 100644
--- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/VideoEventEmitter.java
+++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/VideoEventEmitter.java
@@ -9,6 +9,7 @@ import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.google.android.exoplayer2.metadata.Metadata;
+import com.google.android.exoplayer2.metadata.emsg.EventMessage;
import com.google.android.exoplayer2.metadata.id3.Id3Frame;
import com.google.android.exoplayer2.metadata.id3.TextInformationFrame;
@@ -248,25 +249,38 @@ class VideoEventEmitter {
WritableArray metadataArray = Arguments.createArray();
for (int i = 0; i < metadata.length(); i++) {
+
+ Metadata.Entry entry = metadata.get(i);
+ if (entry instanceof Id3Frame) {
- Id3Frame frame = (Id3Frame) metadata.get(i);
+ Id3Frame frame = (Id3Frame) entry;
- String value = "";
+ String value = "";
- if (frame instanceof TextInformationFrame) {
- TextInformationFrame txxxFrame = (TextInformationFrame) frame;
- value = txxxFrame.value;
+ if (frame instanceof TextInformationFrame) {
+ TextInformationFrame txxxFrame = (TextInformationFrame) frame;
+ value = txxxFrame.value;
+ }
+
+ String identifier = frame.id;
+
+ WritableMap map = Arguments.createMap();
+ map.putString("identifier", identifier);
+ map.putString("value", value);
+
+ metadataArray.pushMap(map);
+
+ } else if (entry instanceof EventMessage) {
+
+ EventMessage eventMessage = (EventMessage) entry;
+
+ WritableMap map = Arguments.createMap();
+ map.putString("identifier", eventMessage.schemeIdUri);
+ map.putString("value", eventMessage.value);
+ metadataArray.pushMap(map);
+
}
-
- String identifier = frame.id;
-
- WritableMap map = Arguments.createMap();
- map.putString("identifier", identifier);
- map.putString("value", value);
-
- metadataArray.pushMap(map);
-
}
WritableMap event = Arguments.createMap();
diff --git a/android-exoplayer/src/main/res/values/strings.xml b/android-exoplayer/src/main/res/values/strings.xml
index 4f69ec34..1f037779 100644
--- a/android-exoplayer/src/main/res/values/strings.xml
+++ b/android-exoplayer/src/main/res/values/strings.xml
@@ -8,7 +8,12 @@
Unable to query device decoders
Unable to instantiate decoder %1$s
+
+ Protected content not supported on API levels below 18
Unrecognized media format
+ This device does not support the required DRM scheme
+
+ An unknown DRM error occurred
diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore
index fc13f169..e9ec10b5 100644
--- a/examples/basic/.gitignore
+++ b/examples/basic/.gitignore
@@ -51,3 +51,5 @@ android/app/libs
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
+
+*.binlog
diff --git a/examples/basic/metro.config.js b/examples/basic/metro.config.js
index be3d561c..59a9b33a 100644
--- a/examples/basic/metro.config.js
+++ b/examples/basic/metro.config.js
@@ -1,4 +1,50 @@
+/**
+ * Metro configuration for React Native
+ * https://github.com/facebook/react-native
+ *
+ * @format
+ */
+const fs = require('fs');
+const path = require('path');
+const blacklist = require('metro-config/src/defaults/blacklist');
+
+const rnPath = fs.realpathSync(
+ path.resolve(require.resolve('react-native/package.json'), '..'),
+);
+const rnwPath = fs.realpathSync(
+ path.resolve(require.resolve('react-native-windows/package.json'), '..'),
+);
+
module.exports = {
+ resolver: {
+ extraNodeModules: {
+ // Redirect react-native to react-native-windows
+ 'react-native': rnwPath,
+ 'react-native-windows': rnwPath,
+ },
+ // Include the macos platform in addition to the defaults because the fork includes macos, but doesn't declare it
+ platforms: ['ios', 'android', 'windesktop', 'windows', 'web', 'macos'],
+ // Since there are multiple copies of react-native, we need to ensure that metro only sees one of them
+ // This should go in RN 0.61 when haste is removed
+ blacklistRE: blacklist([
+ new RegExp(
+ `${(path.resolve(rnPath) + path.sep).replace(/[/\\]/g, '/')}.*`,
+ ),
+
+ // This stops "react-native run-windows" from causing the metro server to crash if its already running
+ new RegExp(
+ `${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`,
+ ),
+ // Prevent recursive node_modules from local react-native-video
+ new RegExp(
+ `${path.resolve(__dirname, 'node_modules/react-native-video/node_modules').replace(/[/\\]/g, '/')}.*`,
+ ),
+ // Prevent recursive examples from local react-native-video
+ new RegExp(
+ `${path.resolve(__dirname, 'node_modules/react-native-video/examples').replace(/[/\\]/g, '/')}.*`,
+ ),
+ ]),
+ },
transformer: {
getTransformOptions: async () => ({
transform: {
@@ -7,4 +53,4 @@ module.exports = {
},
}),
},
-};
\ No newline at end of file
+};
diff --git a/examples/basic/package.json b/examples/basic/package.json
index 057dcac7..0b6e6292 100644
--- a/examples/basic/package.json
+++ b/examples/basic/package.json
@@ -3,14 +3,15 @@
"version": "1.0.0",
"private": true,
"scripts": {
- "start": "node node_modules/react-native/local-cli/cli.js start",
+ "start": "react-native start",
"postinstall": "rm -rf node_modules/react-native-video/{examples,node_modules}",
"test": "jest",
"lint": "eslint ."
},
"dependencies": {
- "react": "16.9.0",
- "react-native": "0.60.5",
+ "react": "^16.12.0",
+ "react-native": "0.61.5",
+ "react-native-windows": "^0.61.0-0",
"react-native-video": "file:../.."
},
"devDependencies": {
@@ -23,4 +24,4 @@
"metro-react-native-babel-preset": "^0.56.0",
"react-test-renderer": "16.8.6"
}
-}
+}
\ No newline at end of file
diff --git a/examples/basic/react-native.config.js b/examples/basic/react-native.config.js
new file mode 100644
index 00000000..cedd9d38
--- /dev/null
+++ b/examples/basic/react-native.config.js
@@ -0,0 +1,5 @@
+const fs = require('fs');
+const path = require('path');
+module.exports = {
+ reactNativePath: fs.realpathSync(path.resolve(require.resolve('react-native-windows/package.json'), '..')),
+};
diff --git a/examples/basic/windows/.gitignore b/examples/basic/windows/.gitignore
index 33d3fde2..878f7ba5 100644
--- a/examples/basic/windows/.gitignore
+++ b/examples/basic/windows/.gitignore
@@ -1,89 +1,92 @@
-*AppPackages*
-*BundleArtifacts*
-*ReactAssets*
-
-#OS junk files
-[Tt]humbs.db
-*.DS_Store
-
-#Visual Studio files
-*.[Oo]bj
-*.user
-*.aps
-*.pch
-*.vspscc
-*.vssscc
-*_i.c
-*_p.c
-*.ncb
-*.suo
-*.tlb
-*.tlh
-*.bak
-*.[Cc]ache
-*.ilk
-*.log
-*.lib
-*.sbr
-*.sdf
-*.opensdf
-*.opendb
-*.unsuccessfulbuild
-ipch/
-[Oo]bj/
-[Bb]in
-[Dd]ebug*/
-[Rr]elease*/
-Ankh.NoLoad
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-#MonoDevelop
-*.pidb
-*.userprefs
-
-#Tooling
-_ReSharper*/
-*.resharper
-[Tt]est[Rr]esult*
-*.sass-cache
-
-#Project files
-[Bb]uild/
-
-#Subversion files
-.svn
-
-# Office Temp Files
-~$*
-
-# vim Temp Files
-*~
-
-#NuGet
-packages/
-*.nupkg
-
-#ncrunch
-*ncrunch*
-*crunch*.local.xml
-
-# visual studio database projects
-*.dbmdl
-
-#Test files
-*.testsettings
-
-#Other files
-*.DotSettings
-.vs/
-*project.lock.json
+*AppPackages*
+*BundleArtifacts*
+
+#OS junk files
+[Tt]humbs.db
+*.DS_Store
+
+#Visual Studio files
+*.[Oo]bj
+*.user
+*.aps
+*.pch
+*.vspscc
+*.vssscc
+*_i.c
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.[Cc]ache
+*.ilk
+*.log
+*.lib
+*.sbr
+*.sdf
+*.opensdf
+*.opendb
+*.unsuccessfulbuild
+ipch/
+[Oo]bj/
+[Bb]in
+[Dd]ebug*/
+[Rr]elease*/
+Ankh.NoLoad
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+#MonoDevelop
+*.pidb
+*.userprefs
+
+#Tooling
+_ReSharper*/
+*.resharper
+[Tt]est[Rr]esult*
+*.sass-cache
+
+#Project files
+[Bb]uild/
+
+#Subversion files
+.svn
+
+# Office Temp Files
+~$*
+
+# vim Temp Files
+*~
+
+#NuGet
+packages/
+*.nupkg
+
+#ncrunch
+*ncrunch*
+*crunch*.local.xml
+
+# visual studio database projects
+*.dbmdl
+
+#Test files
+*.testsettings
+
+#Other files
+*.DotSettings
+.vs/
+*project.lock.json
+
+#Files generated by the VS build
+**/Generated Files/**
+
diff --git a/examples/basic/windows/VideoPlayer.sln b/examples/basic/windows/VideoPlayer.sln
index 3d10db9e..c3c7265b 100644
--- a/examples/basic/windows/VideoPlayer.sln
+++ b/examples/basic/windows/VideoPlayer.sln
@@ -1,141 +1,229 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VideoPlayer", "VideoPlayer\VideoPlayer.csproj", "{A027BE54-D118-49A4-8D84-0666A2A93E64}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactNative", "..\node_modules\react-native-windows\ReactWindows\ReactNative\ReactNative.csproj", "{C7673AD5-E3AA-468C-A5FD-FA38154E205C}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraBridge", "..\node_modules\react-native-windows\ReactWindows\ChakraBridge\ChakraBridge.vcxproj", "{4B72C796-16D5-4E3A-81C0-3E36F531E578}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactNativeVideo", "..\node_modules\react-native-video\windows\ReactNativeVideo\ReactNativeVideo.csproj", "{E8F5F57F-757E-4237-AD23-F7A8755427CD}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|ARM = Debug|ARM
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- DebugBundle|ARM = DebugBundle|ARM
- DebugBundle|x64 = DebugBundle|x64
- DebugBundle|x86 = DebugBundle|x86
- Release|ARM = Release|ARM
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- ReleaseBundle|ARM = ReleaseBundle|ARM
- ReleaseBundle|x64 = ReleaseBundle|x64
- ReleaseBundle|x86 = ReleaseBundle|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|ARM.ActiveCfg = Debug|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|ARM.Build.0 = Debug|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|ARM.Deploy.0 = Debug|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x64.ActiveCfg = Debug|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x64.Build.0 = Debug|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x64.Deploy.0 = Debug|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x86.ActiveCfg = Debug|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x86.Build.0 = Debug|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Debug|x86.Deploy.0 = Debug|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|ARM.ActiveCfg = DebugBundle|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|ARM.Build.0 = DebugBundle|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|ARM.Deploy.0 = DebugBundle|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x64.ActiveCfg = DebugBundle|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x64.Build.0 = DebugBundle|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x64.Deploy.0 = DebugBundle|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x86.ActiveCfg = DebugBundle|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x86.Build.0 = DebugBundle|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.DebugBundle|x86.Deploy.0 = DebugBundle|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|ARM.ActiveCfg = Release|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|ARM.Build.0 = Release|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|ARM.Deploy.0 = Release|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x64.ActiveCfg = Release|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x64.Build.0 = Release|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x64.Deploy.0 = Release|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x86.ActiveCfg = Release|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x86.Build.0 = Release|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.Release|x86.Deploy.0 = Release|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|ARM.ActiveCfg = ReleaseBundle|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|ARM.Build.0 = ReleaseBundle|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|ARM.Deploy.0 = ReleaseBundle|ARM
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x64.ActiveCfg = ReleaseBundle|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x64.Build.0 = ReleaseBundle|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x64.Deploy.0 = ReleaseBundle|x64
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x86.ActiveCfg = ReleaseBundle|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x86.Build.0 = ReleaseBundle|x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}.ReleaseBundle|x86.Deploy.0 = ReleaseBundle|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.ActiveCfg = Debug|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.Build.0 = Debug|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.ActiveCfg = Debug|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.Build.0 = Debug|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.ActiveCfg = Debug|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.Build.0 = Debug|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.Build.0 = Release|ARM
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.ActiveCfg = Release|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.Build.0 = Release|x64
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.ActiveCfg = Release|x86
- {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.Build.0 = Release|x86
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.ActiveCfg = Debug|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.Build.0 = Debug|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.ActiveCfg = Debug|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.Build.0 = Debug|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.ActiveCfg = Debug|Win32
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.Build.0 = Debug|Win32
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.ActiveCfg = Release|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.Build.0 = Release|ARM
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.ActiveCfg = Release|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.Build.0 = Release|x64
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.ActiveCfg = Release|Win32
- {4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.Build.0 = Release|Win32
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|ARM.ActiveCfg = Debug|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|ARM.Build.0 = Debug|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x64.ActiveCfg = Debug|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x64.Build.0 = Debug|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x86.ActiveCfg = Debug|x86
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Debug|x86.Build.0 = Debug|x86
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|ARM.ActiveCfg = Debug|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|ARM.Build.0 = Debug|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x64.ActiveCfg = Debug|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x64.Build.0 = Debug|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x86.ActiveCfg = Debug|x86
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.DebugBundle|x86.Build.0 = Debug|x86
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|ARM.ActiveCfg = Release|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|ARM.Build.0 = Release|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x64.ActiveCfg = Release|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x64.Build.0 = Release|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x86.ActiveCfg = Release|x86
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.Release|x86.Build.0 = Release|x86
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|ARM.ActiveCfg = Release|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|ARM.Build.0 = Release|ARM
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x64.ActiveCfg = Release|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x64.Build.0 = Release|x64
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x86.ActiveCfg = Release|x86
- {E8F5F57F-757E-4237-AD23-F7A8755427CD}.ReleaseBundle|x86.Build.0 = Release|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29215.179
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoPlayer", "VideoPlayer\VideoPlayer.vcxproj", "{ADF1CF02-8224-4167-A737-8CBE1A0D5208}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {F7D32BD0-2749-483E-9A0D-1635EF7E3136}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Folly", "..\node_modules\react-native-windows\Folly\Folly.vcxproj", "{A990658C-CE31-4BCC-976F-0FC6B1AF693D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactCommon", "..\node_modules\react-native-windows\ReactCommon\ReactCommon.vcxproj", "{A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}"
+ ProjectSection(ProjectDependencies) = postProject
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {A990658C-CE31-4BCC-976F-0FC6B1AF693D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactWindowsCore", "..\node_modules\react-native-windows\ReactWindowsCore\ReactWindowsCore.vcxproj", "{11C084A3-A57C-4296-A679-CAC17B603144}"
+ ProjectSection(ProjectDependencies) = postProject
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {A990658C-CE31-4BCC-976F-0FC6B1AF693D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra", "..\node_modules\react-native-windows\Chakra\Chakra.vcxitems", "{C38970C0-5FBF-4D69-90D8-CBAC225AE895}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative", "..\node_modules\react-native-windows\Microsoft.ReactNative\Microsoft.ReactNative.vcxproj", "{F7D32BD0-2749-483E-9A0D-1635EF7E3136}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Shared", "..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems", "{0CC28589-39E4-4288-B162-97B959F8B843}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Universal", "..\node_modules\react-native-windows\JSI\Universal\JSI.Universal.vcxproj", "{A62D504A-16B8-41D2-9F19-E2E86019E5E4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Cxx", "..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems", "{DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.ReactNative.SharedManaged", "..\node_modules\react-native-windows\Microsoft.ReactNative.SharedManaged\Microsoft.ReactNative.SharedManaged.shproj", "{67A1076F-7790-4203-86EA-4402CCB5E782}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\node_modules\react-native-windows\Common\Common.vcxproj", "{FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReactNative", "ReactNative", "{5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shared", "..\node_modules\react-native-windows\Shared\Shared.vcxitems", "{2049DBE9-8D13-42C9-AE4B-413AE38FFFD0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\react-native-windows\Mso\Mso.vcxitems", "{84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeVideoCPP61", "..\node_modules\react-native-video\windows\ReactNativeVideoCPP61\ReactNativeVideoCPP61.vcxproj", "{765365E4-9553-4900-9F69-E26D4309C8DA}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{0cc28589-39e4-4288-b162-97b959f8b843}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{2049dbe9-8d13-42c9-ae4b-413ae38fffd0}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.SharedManaged\Microsoft.ReactNative.SharedManaged.projitems*{67a1076f-7790-4203-86ea-4402ccb5e782}*SharedItemsImports = 13
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{765365e4-9553-4900-9f69-e26d4309c8da}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{84e05bfa-cbaf-4f0d-bfb6-4ce85742a57e}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{a62d504a-16b8-41d2-9f19-e2e86019e5e4}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{adf1cf02-8224-4167-a737-8cbe1a0d5208}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{c38970c0-5fbf-4d69-90d8-cbac225ae895}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{da8b35b3-da00-4b02-bde6-6a397b3fd46b}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|ARM.ActiveCfg = Debug|ARM
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|ARM.Build.0 = Debug|ARM
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|ARM.Deploy.0 = Debug|ARM
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|ARM64.Build.0 = Debug|ARM64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|x64.ActiveCfg = Debug|x64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|x64.Build.0 = Debug|x64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|x64.Deploy.0 = Debug|x64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|x86.ActiveCfg = Debug|Win32
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|x86.Build.0 = Debug|Win32
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Debug|x86.Deploy.0 = Debug|Win32
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|ARM.ActiveCfg = Release|ARM
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|ARM.Build.0 = Release|ARM
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|ARM.Deploy.0 = Release|ARM
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|ARM64.ActiveCfg = Release|ARM64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|ARM64.Build.0 = Release|ARM64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|ARM64.Deploy.0 = Release|ARM64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|x64.ActiveCfg = Release|x64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|x64.Build.0 = Release|x64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|x64.Deploy.0 = Release|x64
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|x86.ActiveCfg = Release|Win32
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|x86.Build.0 = Release|Win32
+ {ADF1CF02-8224-4167-A737-8CBE1A0D5208}.Release|x86.Deploy.0 = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.ActiveCfg = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.Build.0 = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.ActiveCfg = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.Build.0 = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.ActiveCfg = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.Build.0 = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.Build.0 = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.ActiveCfg = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.Build.0 = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.ActiveCfg = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.Build.0 = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.Build.0 = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.ActiveCfg = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.Build.0 = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.ActiveCfg = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.Build.0 = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.ActiveCfg = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.Build.0 = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.Build.0 = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.ActiveCfg = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.Build.0 = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.ActiveCfg = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.Build.0 = Release|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM.ActiveCfg = Debug|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM.Build.0 = Debug|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM64.Build.0 = Debug|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x64.ActiveCfg = Debug|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x64.Build.0 = Debug|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x86.ActiveCfg = Debug|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x86.Build.0 = Debug|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM.ActiveCfg = Release|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM.Build.0 = Release|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM64.ActiveCfg = Release|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM64.Build.0 = Release|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x64.ActiveCfg = Release|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x64.Build.0 = Release|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x86.ActiveCfg = Release|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x86.Build.0 = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.ActiveCfg = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.Build.0 = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.Build.0 = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.ActiveCfg = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.Build.0 = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.ActiveCfg = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.Build.0 = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.ActiveCfg = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.Build.0 = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.ActiveCfg = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.Build.0 = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.ActiveCfg = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.Build.0 = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.ActiveCfg = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.Build.0 = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.Build.0 = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.ActiveCfg = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.Build.0 = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.ActiveCfg = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.Build.0 = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.ActiveCfg = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.Build.0 = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.Build.0 = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.ActiveCfg = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.Build.0 = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.ActiveCfg = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.Build.0 = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.Build.0 = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.ActiveCfg = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.Build.0 = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.ActiveCfg = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.Build.0 = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.ActiveCfg = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.Build.0 = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.Build.0 = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.ActiveCfg = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|ARM.ActiveCfg = Debug|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|ARM.Build.0 = Debug|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|ARM64.Build.0 = Debug|ARM64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x64.ActiveCfg = Debug|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x64.Build.0 = Debug|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x86.ActiveCfg = Debug|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x86.Build.0 = Debug|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|ARM.ActiveCfg = Release|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|ARM.Build.0 = Release|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|ARM64.ActiveCfg = Release|ARM64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|ARM64.Build.0 = Release|ARM64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x64.ActiveCfg = Release|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x64.Build.0 = Release|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x86.ActiveCfg = Release|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {11C084A3-A57C-4296-A679-CAC17B603144} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {C38970C0-5FBF-4D69-90D8-CBAC225AE895} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {0CC28589-39E4-4288-B162-97B959F8B843} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {67A1076F-7790-4203-86EA-4402CCB5E782} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {2049DBE9-8D13-42C9-AE4B-413AE38FFFD0} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {D43FAD39-F619-437D-BB40-04A3982ACB6A}
+ EndGlobalSection
+EndGlobal
diff --git a/examples/basic/windows/VideoPlayer/App.cpp b/examples/basic/windows/VideoPlayer/App.cpp
new file mode 100644
index 00000000..9bc4bf46
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/App.cpp
@@ -0,0 +1,50 @@
+#include "pch.h"
+
+#include "App.h"
+#include "ReactPackageProvider.h"
+
+#include "winrt/ReactNativeVideoCPP.h"
+
+using namespace winrt::VideoPlayer;
+using namespace winrt::VideoPlayer::implementation;
+
+///
+/// Initializes the singleton application object. This is the first line of
+/// authored code executed, and as such is the logical equivalent of main() or
+/// WinMain().
+///
+App::App() noexcept
+{
+ MainComponentName(L"VideoPlayer");
+
+#if BUNDLE
+ JavaScriptBundleFile(L"index.windows");
+ InstanceSettings().UseWebDebugger(false);
+ InstanceSettings().UseFastRefresh(false);
+#else
+ JavaScriptMainModuleName(L"index");
+ InstanceSettings().UseWebDebugger(true);
+ InstanceSettings().UseFastRefresh(true);
+#endif
+
+#if _DEBUG
+ InstanceSettings().EnableDeveloperMenu(true);
+#else
+ InstanceSettings().EnableDeveloperMenu(false);
+#endif
+
+ PackageProviders().Append(make()); // Includes all modules in this project
+
+ PackageProviders().Append(winrt::ReactNativeVideoCPP::ReactPackageProvider());
+
+ REACT_REGISTER_NATIVE_MODULE_PACKAGES(); //code-gen macro from autolink
+
+ InitializeComponent();
+
+ // This works around a cpp/winrt bug with composable/aggregable types tracked
+ // by 22116519
+ AddRef();
+ m_inner.as<::IUnknown>()->Release();
+}
+
+
diff --git a/examples/basic/windows/VideoPlayer/App.h b/examples/basic/windows/VideoPlayer/App.h
new file mode 100644
index 00000000..f2dc98d3
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/App.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "App.xaml.g.h"
+
+
+
+namespace winrt::VideoPlayer::implementation
+{
+ struct App : AppT
+ {
+ App() noexcept;
+ };
+} // namespace winrt::VideoPlayer::implementation
+
+
diff --git a/examples/basic/windows/VideoPlayer/App.idl b/examples/basic/windows/VideoPlayer/App.idl
new file mode 100644
index 00000000..fca0646c
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/App.idl
@@ -0,0 +1,3 @@
+namespace VideoPlayer
+{
+}
diff --git a/examples/basic/windows/VideoPlayer/App.xaml b/examples/basic/windows/VideoPlayer/App.xaml
index 02a3efbb..1cf8c542 100644
--- a/examples/basic/windows/VideoPlayer/App.xaml
+++ b/examples/basic/windows/VideoPlayer/App.xaml
@@ -1,8 +1,10 @@
-
-
-
+
+
+
+
+
diff --git a/examples/basic/windows/VideoPlayer/App.xaml.cs b/examples/basic/windows/VideoPlayer/App.xaml.cs
deleted file mode 100644
index 491a7ce5..00000000
--- a/examples/basic/windows/VideoPlayer/App.xaml.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using ReactNative;
-using System;
-using Windows.ApplicationModel;
-using Windows.ApplicationModel.Activation;
-using Windows.UI.Core;
-using Windows.UI.Xaml;
-using Windows.UI.Xaml.Controls;
-using Windows.UI.Xaml.Navigation;
-
-namespace VideoPlayer
-{
- ///
- /// Provides application-specific behavior to supplement the default Application class.
- ///
- sealed partial class App : Application
- {
- private readonly ReactPage _reactPage;
-
- ///
- /// Initializes the singleton application object. This is the first line of authored code
- /// executed, and as such is the logical equivalent of main() or WinMain().
- ///
- public App()
- {
- this.InitializeComponent();
- this.Suspending += OnSuspending;
- this.Resuming += OnResuming;
-
- _reactPage = new MainPage();
- }
-
- ///
- /// Invoked when the application is launched normally by the end user. Other entry points
- /// will be used such as when the application is launched to open a specific file.
- ///
- /// Details about the launch request and process.
- protected override void OnLaunched(LaunchActivatedEventArgs e)
- {
- _reactPage.OnResume(Exit);
-
-#if DEBUG
- if (System.Diagnostics.Debugger.IsAttached)
- {
- this.DebugSettings.EnableFrameRateCounter = true;
- }
-
- SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
- AppViewBackButtonVisibility.Visible;
-#endif
-
- Frame rootFrame = Window.Current.Content as Frame;
-
- // Do not repeat app initialization when the Window already has content,
- // just ensure that the window is active
- if (rootFrame == null)
- {
- _reactPage.OnCreate(e.Arguments);
-
- // Create a Frame to act as the navigation context and navigate to the first page
- rootFrame = new Frame();
-
- rootFrame.NavigationFailed += OnNavigationFailed;
-
- // Place the frame in the current Window
- Window.Current.Content = rootFrame;
- }
-
- if (rootFrame.Content == null)
- {
- // When the navigation stack isn't restored navigate to the first page,
- // configuring the new page by passing required information as a navigation
- // parameter
- rootFrame.Content = _reactPage;
- }
-
- // Ensure the current window is active
- Window.Current.Activate();
- }
-
- ///
- /// Invoked when Navigation to a certain page fails
- ///
- /// The Frame which failed navigation
- /// Details about the navigation failure
- void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
- {
- throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
- }
-
- ///
- /// Invoked when application execution is being suspended. Application state is saved
- /// without knowing whether the application will be terminated or resumed with the contents
- /// of memory still intact.
- ///
- /// The source of the suspend request.
- /// Details about the suspend request.
- private void OnSuspending(object sender, SuspendingEventArgs e)
- {
- _reactPage.OnSuspend();
- }
-
- ///
- /// Invoked when application execution is being resumed.
- ///
- /// The source of the resume request.
- /// Details about the resume request.
- private void OnResuming(object sender, object e)
- {
- _reactPage.OnResume(Exit);
- }
- }
-}
diff --git a/examples/basic/windows/VideoPlayer/Bundle/.gitignore b/examples/basic/windows/VideoPlayer/Bundle/.gitignore
new file mode 100644
index 00000000..005717ea
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/Bundle/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/examples/basic/windows/VideoPlayer/MainPage.cs b/examples/basic/windows/VideoPlayer/MainPage.cs
deleted file mode 100644
index 4db71186..00000000
--- a/examples/basic/windows/VideoPlayer/MainPage.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using ReactNative;
-using ReactNative.Modules.Core;
-using ReactNative.Shell;
-using ReactNativeVideo;
-using System.Collections.Generic;
-using Windows.UI.Xaml.Media.Imaging;
-
-namespace VideoPlayer
-{
- class MainPage : ReactPage
- {
- public override string MainComponentName
- {
- get
- {
- return "VideoPlayer";
- }
- }
-
-#if BUNDLE
- public override string JavaScriptBundleFile
- {
- get
- {
- return "ms-appx:///ReactAssets/index.windows.bundle";
- }
- }
-#endif
-
- public override List Packages
- {
- get
- {
- return new List
- {
- new MainReactPackage(),
- new ReactVideoPackage(),
- };
- }
- }
-
- public override bool UseDeveloperSupport
- {
- get
- {
-#if !BUNDLE || DEBUG
- return true;
-#else
- return false;
-#endif
- }
- }
- }
-
-}
diff --git a/examples/basic/windows/VideoPlayer/Package.appxmanifest b/examples/basic/windows/VideoPlayer/Package.appxmanifest
index be303ca5..13b3564f 100644
--- a/examples/basic/windows/VideoPlayer/Package.appxmanifest
+++ b/examples/basic/windows/VideoPlayer/Package.appxmanifest
@@ -1,49 +1,49 @@
-
-
-
-
-
-
-
-
-
- VideoPlayer
- React Native for UWP
- Assets\StoreLogo.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ VideoPlayer
+ react-native-video
+ Assets\StoreLogo.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/Properties/AssemblyInfo.cs b/examples/basic/windows/VideoPlayer/Properties/AssemblyInfo.cs
deleted file mode 100644
index cb6ff6b7..00000000
--- a/examples/basic/windows/VideoPlayer/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("VideoPlayer")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("VideoPlayer")]
-[assembly: AssemblyCopyright("Copyright © 2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
-[assembly: ComVisible(false)]
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/Properties/Default.rd.xml b/examples/basic/windows/VideoPlayer/Properties/Default.rd.xml
deleted file mode 100644
index 86952373..00000000
--- a/examples/basic/windows/VideoPlayer/Properties/Default.rd.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/PropertySheet.props b/examples/basic/windows/VideoPlayer/PropertySheet.props
new file mode 100644
index 00000000..3e15bb90
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/PropertySheet.props
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/ReactPackageProvider.cpp b/examples/basic/windows/VideoPlayer/ReactPackageProvider.cpp
new file mode 100644
index 00000000..e6127dd4
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/ReactPackageProvider.cpp
@@ -0,0 +1,20 @@
+#include "pch.h"
+#include "ReactPackageProvider.h"
+
+#include "NativeModules.h"
+
+
+
+using namespace winrt::Microsoft::ReactNative;
+
+namespace winrt::VideoPlayer::implementation
+{
+
+void ReactPackageProvider::CreatePackage(IReactPackageBuilder const &packageBuilder) noexcept
+{
+ AddAttributedModules(packageBuilder);
+}
+
+} // namespace winrt::VideoPlayer::implementation
+
+
diff --git a/examples/basic/windows/VideoPlayer/ReactPackageProvider.h b/examples/basic/windows/VideoPlayer/ReactPackageProvider.h
new file mode 100644
index 00000000..d8e8df89
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/ReactPackageProvider.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "winrt/Microsoft.ReactNative.h"
+
+
+
+using namespace winrt::Microsoft::ReactNative;
+
+namespace winrt::VideoPlayer::implementation
+{
+
+ struct ReactPackageProvider : winrt::implements
+ {
+ public: // IReactPackageProvider
+ void CreatePackage(IReactPackageBuilder const &packageBuilder) noexcept;
+ };
+
+} // namespace winrt::VideoPlayer::implementation
+
+
diff --git a/examples/basic/windows/VideoPlayer/VideoPlayer.csproj b/examples/basic/windows/VideoPlayer/VideoPlayer.csproj
deleted file mode 100644
index 96611032..00000000
--- a/examples/basic/windows/VideoPlayer/VideoPlayer.csproj
+++ /dev/null
@@ -1,230 +0,0 @@
-
-
-
-
- Debug
- x86
- {A027BE54-D118-49A4-8D84-0666A2A93E64}
- AppContainerExe
- Properties
- VideoPlayer
- VideoPlayer
- en-US
- UAP
- 10.0.14393.0
- 10.0.10586.0
- 14
- 512
- {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- VideoPlayer_TemporaryKey.pfx
-
-
- true
- bin\x86\Debug\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
- ;2008
- full
- x86
- false
- prompt
- true
-
-
- true
- bin\x86\DebugBundle\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE
- ;2008
- true
- full
- x86
- false
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- bin\x86\Release\
- TRACE;NETFX_CORE;WINDOWS_UWP
- true
- ;2008
- pdbonly
- x86
- false
- prompt
- true
- true
-
-
- bin\x86\ReleaseBundle\
- TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE
- true
- ;2008
- true
- pdbonly
- x86
- false
- prompt
- MinimumRecommendedRules.ruleset
- true
- true
-
-
- true
- bin\ARM\Debug\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
- ;2008
- full
- ARM
- false
- prompt
- true
-
-
- true
- bin\ARM\DebugBundle\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE
- ;2008
- true
- full
- ARM
- false
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- bin\ARM\Release\
- TRACE;NETFX_CORE;WINDOWS_UWP
- true
- ;2008
- pdbonly
- ARM
- false
- prompt
- true
- true
-
-
- bin\ARM\ReleaseBundle\
- TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE
- true
- ;2008
- true
- pdbonly
- ARM
- false
- prompt
- MinimumRecommendedRules.ruleset
- true
- true
-
-
- true
- bin\x64\Debug\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
- ;2008
- full
- x64
- false
- prompt
- true
-
-
- true
- bin\x64\DebugBundle\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE
- ;2008
- true
- full
- x64
- false
- prompt
- MinimumRecommendedRules.ruleset
- true
-
-
- bin\x64\Release\
- TRACE;NETFX_CORE;WINDOWS_UWP
- true
- ;2008
- pdbonly
- x64
- false
- prompt
- true
- true
-
-
- bin\x64\ReleaseBundle\
- TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE
- true
- ;2008
- true
- pdbonly
- x64
- false
- prompt
- MinimumRecommendedRules.ruleset
- true
- true
-
-
-
-
-
-
-
- App.xaml
-
-
-
-
-
-
- Designer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- MSBuild:Compile
- Designer
-
-
-
-
- {e8f5f57f-757e-4237-ad23-f7a8755427cd}
- ReactNativeVideo
-
-
- {c7673ad5-e3aa-468c-a5fd-fa38154e205c}
- ReactNative
-
-
-
-
- PreserveNewest
-
-
-
- 14.0
-
-
-
-
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/VideoPlayer.vcxproj b/examples/basic/windows/VideoPlayer/VideoPlayer.vcxproj
new file mode 100644
index 00000000..94a0299d
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/VideoPlayer.vcxproj
@@ -0,0 +1,180 @@
+
+
+
+
+ true
+ true
+ true
+ {adf1cf02-8224-4167-a737-8cbe1a0d5208}
+ VideoPlayer
+ VideoPlayer
+ en-US
+ 15.0
+ true
+ Windows Store
+ 10.0
+ 10.0.18362.0
+ 10.0.15063.0
+ VideoPlayer_TemporaryKey.pfx
+ EB6A55E244E582B009FB1C12D3D915243789F63A
+
+
+
+
+ Debug
+ ARM
+
+
+ Debug
+ ARM64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ ARM
+
+
+ Release
+ ARM64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ Application
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ true
+ true
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use
+ pch.h
+ $(IntDir)pch.pch
+ Level4
+ %(AdditionalOptions) /bigobj
+ 4453;28204
+
+
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+
+
+
+
+ App.xaml
+
+
+
+
+ Designer
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+
+
+ App.xaml
+
+
+
+
+
+ App.xaml
+
+
+
+
+
+
+
+ false
+
+
+
+
+ {765365e4-9553-4900-9f69-e26d4309c8da}
+
+
+ {f7d32bd0-2749-483e-9a0d-1635ef7e3136}
+
+
+
+
+
+ npx --no-install react-native bundle --platform windows --entry-file index.js --bundle-output $(MSBuildThisFileDirectory)/Bundle/index.windows.bundle --assets-dest $(MSBuildThisFileDirectory)/Bundle
+
+ True
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/VideoPlayer.vcxproj.filters b/examples/basic/windows/VideoPlayer/VideoPlayer.vcxproj.filters
new file mode 100644
index 00000000..28e3f728
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/VideoPlayer.vcxproj.filters
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Assets
+
+
+ Assets
+
+
+ Assets
+
+
+ Assets
+
+
+ Assets
+
+
+ Assets
+
+
+ Assets
+
+
+
+
+
+
+
+ {e48dc53e-40b1-40cb-970a-f89935452892}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/VideoPlayer_TemporaryKey.pfx b/examples/basic/windows/VideoPlayer/VideoPlayer_TemporaryKey.pfx
index 08328fc1..b16850da 100644
Binary files a/examples/basic/windows/VideoPlayer/VideoPlayer_TemporaryKey.pfx and b/examples/basic/windows/VideoPlayer/VideoPlayer_TemporaryKey.pfx differ
diff --git a/examples/basic/windows/VideoPlayer/nativeModules.g.h b/examples/basic/windows/VideoPlayer/nativeModules.g.h
new file mode 100644
index 00000000..be2539eb
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/nativeModules.g.h
@@ -0,0 +1,2 @@
+// NativeModules.g.h -- contents generated by "react-native run-windows"
+#define REACT_REGISTER_NATIVE_MODULE_PACKAGES()
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/packages.config b/examples/basic/windows/VideoPlayer/packages.config
new file mode 100644
index 00000000..21349199
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/basic/windows/VideoPlayer/pch.cpp b/examples/basic/windows/VideoPlayer/pch.cpp
new file mode 100644
index 00000000..e0d2ef1a
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/pch.cpp
@@ -0,0 +1 @@
+#include "pch.h"
diff --git a/examples/basic/windows/VideoPlayer/pch.h b/examples/basic/windows/VideoPlayer/pch.h
new file mode 100644
index 00000000..6cd79994
--- /dev/null
+++ b/examples/basic/windows/VideoPlayer/pch.h
@@ -0,0 +1,28 @@
+#pragma once
+
+#define NOMINMAX
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include "nativeModules.g.h"
diff --git a/examples/basic/windows/VideoPlayer/project.json b/examples/basic/windows/VideoPlayer/project.json
deleted file mode 100644
index bf00b26b..00000000
--- a/examples/basic/windows/VideoPlayer/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "dependencies": {
- "Facebook.CSSLayout": "2.0.1-pre",
- "Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2"
- },
- "frameworks": {
- "uap10.0": {}
- },
- "runtimes": {
- "win10-arm": {},
- "win10-arm-aot": {},
- "win10-x86": {},
- "win10-x86-aot": {},
- "win10-x64": {},
- "win10-x64-aot": {}
- }
-}
\ No newline at end of file
diff --git a/examples/basic/yarn.lock b/examples/basic/yarn.lock
index 50d8d52e..d9970938 100644
--- a/examples/basic/yarn.lock
+++ b/examples/basic/yarn.lock
@@ -615,6 +615,13 @@
dependencies:
regenerator-runtime "^0.13.2"
+"@babel/runtime@^7.4.0":
+ version "7.12.5"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
+ integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
version "7.6.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
@@ -836,12 +843,29 @@
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^13.0.0"
-"@react-native-community/cli-platform-android@^2.6.0", "@react-native-community/cli-platform-android@^2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-2.9.0.tgz#28831e61ce565a2c7d1905852fce1eecfd33cb5e"
- integrity sha512-VEQs4Q6R5tnlYFrQIFoPEWjLc43whRHC9HeH+idbFymwDqysLVUffQbb9D6PJUj+C/AvrDhBhU6S3tDjGbSsag==
+"@jest/types@^25.5.0":
+ version "25.5.0"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d"
+ integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==
dependencies:
- "@react-native-community/cli-tools" "^2.8.3"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^1.1.1"
+ "@types/yargs" "^15.0.0"
+ chalk "^3.0.0"
+
+"@react-native-community/cli-debugger-ui@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-3.0.0.tgz#d01d08d1e5ddc1633d82c7d84d48fff07bd39416"
+ integrity sha512-m3X+iWLsK/H7/b7PpbNO33eQayR/+M26la4ZbYe1KRke5Umg4PIWsvg21O8Tw4uJcY8LA5hsP+rBi/syBkBf0g==
+ dependencies:
+ serve-static "^1.13.1"
+
+"@react-native-community/cli-platform-android@^3.0.0":
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-3.1.4.tgz#61f964dc311623e60b0fb29c5f3732cc8a6f076f"
+ integrity sha512-ClSdY20F0gzWVLTqCv7vHjnUqOcuq10jd9GgHX6lGSc2GI+Ql3/aQg3tmG4uY3KXNNwAv3U8QCoYgg1WGfwiHA==
+ dependencies:
+ "@react-native-community/cli-tools" "^3.0.0"
chalk "^2.4.2"
execa "^1.0.0"
jetifier "^1.6.2"
@@ -849,52 +873,61 @@
slash "^3.0.0"
xmldoc "^1.1.2"
-"@react-native-community/cli-platform-ios@^2.4.1", "@react-native-community/cli-platform-ios@^2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-2.9.0.tgz#21adb8ee813d6ca6fd9d4d9be63f92024f7e2fe7"
- integrity sha512-vg6EOamtFaaQ02FiWu+jzJTfeTJ0OVjJSAoR2rhJKNye6RgJLoQlfp0Hg3waF6XrO72a7afYZsPdKSlN3ewlHg==
+"@react-native-community/cli-platform-ios@^3.0.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-3.2.0.tgz#c469444f5993c9e6737a4b16d78cf033e3702f00"
+ integrity sha512-pzEnx68H6+mHBq5jsMrr3UmAmkrLSMlC9BZ4yoUdfUXCQq6/R70zNYvH4hjUw8h2Al7Kgq53UzHUsM0ph8TSWQ==
dependencies:
- "@react-native-community/cli-tools" "^2.8.3"
+ "@react-native-community/cli-tools" "^3.0.0"
chalk "^2.4.2"
+ js-yaml "^3.13.1"
xcode "^2.0.0"
-"@react-native-community/cli-tools@^2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-2.8.3.tgz#0e2249f48cf4603fb8d740a9f0715c31ac131ceb"
- integrity sha512-N5Pz+pR+GFq3JApjd0SW4jp9KC7kbKsMH65QLRh30JNsxdPvNkYox6/ZZdkvdXaI5ev3EckR7eqlcwi5gpVTYQ==
+"@react-native-community/cli-tools@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-3.0.0.tgz#fe48b80822ed7e49b8af051f9fe41e22a2a710b1"
+ integrity sha512-8IhQKZdf3E4CR8T7HhkPGgorot/cLkRDgneJFDSWk/wCYZAuUh4NEAdumQV7N0jLSMWX7xxiWUPi94lOBxVY9g==
dependencies:
chalk "^2.4.2"
lodash "^4.17.5"
mime "^2.4.1"
node-fetch "^2.5.0"
-"@react-native-community/cli@^2.6.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-2.9.0.tgz#f0d18dc3e5a8f68e3d6ad353c444dc2f08d3fbdc"
- integrity sha512-6TYkrR1pwIEPpiPZnOYscCGr5Xh8RijqBPVAOGTaEdpQQpc/J7GDPrePwbyTzwmCPtiK6XT+T5+1AiAK5bz/sw==
+"@react-native-community/cli-types@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-3.0.0.tgz#488d46605cb05e88537e030f38da236eeda74652"
+ integrity sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg==
+
+"@react-native-community/cli@^3.0.0":
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-3.2.1.tgz#2a466801eb6080a1f73358c5d740c53c24ed8c6f"
+ integrity sha512-bZ/bfZ+9r1gQSxp6t7+00DcpC6vmbVYSvzUCFM/yo5k8bhsDdcy8aocscIaXXVGG+v9Edri/Q7hH9ks7L18/Rg==
dependencies:
"@hapi/joi" "^15.0.3"
- "@react-native-community/cli-platform-android" "^2.9.0"
- "@react-native-community/cli-platform-ios" "^2.9.0"
- "@react-native-community/cli-tools" "^2.8.3"
+ "@react-native-community/cli-debugger-ui" "^3.0.0"
+ "@react-native-community/cli-tools" "^3.0.0"
+ "@react-native-community/cli-types" "^3.0.0"
chalk "^2.4.2"
+ command-exists "^1.2.8"
commander "^2.19.0"
compression "^1.7.1"
connect "^3.6.5"
cosmiconfig "^5.1.0"
deepmerge "^3.2.0"
+ didyoumean "^1.2.1"
envinfo "^7.1.0"
errorhandler "^1.5.0"
execa "^1.0.0"
+ find-up "^4.1.0"
fs-extra "^7.0.1"
glob "^7.1.1"
graceful-fs "^4.1.3"
inquirer "^3.0.6"
lodash "^4.17.5"
- metro "^0.54.1"
- metro-config "^0.54.1"
- metro-core "^0.54.1"
- metro-react-native-babel-transformer "^0.54.1"
+ metro "^0.56.0"
+ metro-config "^0.56.0"
+ metro-core "^0.56.0"
+ metro-react-native-babel-transformer "^0.56.0"
minimist "^1.2.0"
mkdirp "^0.5.1"
morgan "^1.9.0"
@@ -902,9 +935,13 @@
open "^6.2.0"
ora "^3.4.0"
plist "^3.0.0"
- semver "^5.0.3"
+ pretty-format "^25.1.0"
+ semver "^6.3.0"
serve-static "^1.13.1"
shell-quote "1.6.1"
+ strip-ansi "^5.2.0"
+ sudo-prompt "^9.0.0"
+ wcwidth "^1.0.1"
ws "^1.1.0"
"@react-native-community/eslint-config@^0.0.5":
@@ -1004,6 +1041,13 @@
dependencies:
"@types/yargs-parser" "*"
+"@types/yargs@^15.0.0":
+ version "15.0.11"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.11.tgz#361d7579ecdac1527687bcebf9946621c12ab78c"
+ integrity sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
"@typescript-eslint/eslint-plugin@^1.5.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz#22fed9b16ddfeb402fd7bcde56307820f6ebc49f"
@@ -1179,6 +1223,11 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -1186,6 +1235,13 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
@@ -1642,6 +1698,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
chardet@^0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
@@ -1684,6 +1748,11 @@ cli-spinners@^2.0.0:
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77"
integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==
+cli-spinners@^2.2.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047"
+ integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==
+
cli-width@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
@@ -1742,11 +1811,23 @@ color-convert@^1.9.0:
dependencies:
color-name "1.1.3"
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
@@ -1764,6 +1845,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
commander@^2.19.0, commander@~2.20.0:
version "2.20.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
@@ -2053,6 +2139,11 @@ detect-newline@^2.1.0:
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
+didyoumean@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff"
+ integrity sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=
+
diff-sequences@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
@@ -2072,10 +2163,6 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-dom-walk@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
-
domexception@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
@@ -2093,6 +2180,11 @@ ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+eme-encryption-scheme-polyfill@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.0.1.tgz#b080b01bffd74c75c9cf8044c1cabedf3b83954f"
+ integrity sha512-Wz+Ro1c0/2Wsx2RLFvTOO0m4LvYn+7cSnq3XOvRvLLBq8jbvUACH/zpU9s0/5+mQa5oaelkU69x+q0z/iWYrFA==
+
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@@ -2121,6 +2213,11 @@ envinfo@^7.1.0:
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.3.1.tgz#892e42f7bf858b3446d9414ad240dbaf8da52f09"
integrity sha512-GvXiDTqLYrORVSCuJCsWHPXF5BFvoWMQA9xX4YVjPT1jyS3aZEHUBwjzxU/6LTPF9ReHgVEbX7IEN5UvSXHw/A==
+envinfo@^7.5.0:
+ version "7.7.3"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc"
+ integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==
+
error-ex@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
@@ -2665,6 +2762,14 @@ find-up@^3.0.0:
dependencies:
locate-path "^3.0.0"
+find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
flat-cache@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
@@ -2808,6 +2913,18 @@ glob-parent@^5.0.0:
dependencies:
is-glob "^4.0.1"
+glob@^7.0.0:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
glob@^7.0.5:
version "7.1.1"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
@@ -2831,13 +2948,6 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
-global@^4.3.0:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df"
- dependencies:
- min-document "^2.19.0"
- process "~0.5.1"
-
globals@^11.1.0, globals@^11.7.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -2886,6 +2996,11 @@ has-flag@^3.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
has-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
@@ -2933,10 +3048,10 @@ has@^1.0.1, has@^1.0.3:
dependencies:
function-bind "^1.1.1"
-hermesvm@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/hermesvm/-/hermesvm-0.1.1.tgz#bd1df92b4dc504e261c23df34864daf24b844d03"
- integrity sha512-EosSDeUqTTGvlc9vQiy5Y/9GBlucEyo6lYuxg/FnukHCD/CP3NYeDAGV54TyZ19FgSqMEoPgOH9cyxvv8epQ1g==
+hermes-engine@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.2.1.tgz#25c0f1ff852512a92cb5c5cc47cf967e1e722ea2"
+ integrity sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ==
hosted-git-info@^2.1.4:
version "2.2.0"
@@ -3089,6 +3204,11 @@ inquirer@^6.4.1:
strip-ansi "^5.1.0"
through "^2.3.6"
+interpret@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
@@ -3150,6 +3270,13 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
+is-core-module@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+ dependencies:
+ has "^1.0.3"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -3752,7 +3879,7 @@ jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
-jsc-android@245459.0.0:
+jsc-android@^245459.0.0:
version "245459.0.0"
resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9"
integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==
@@ -3985,6 +4112,13 @@ locate-path@^3.0.0:
p-locate "^3.0.0"
path-exists "^3.0.0"
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@@ -4010,7 +4144,7 @@ lodash@^4.17.11, lodash@^4.17.5:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
-lodash@^4.3.0, lodash@^4.6.1:
+lodash@^4.3.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
@@ -4090,7 +4224,7 @@ mem@^1.1.0:
dependencies:
mimic-fn "^1.0.0"
-mem@^4.0.0:
+mem@^4.0.0, mem@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
@@ -4111,10 +4245,10 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-metro-babel-register@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.54.1.tgz#7d2bfe444b1ccef8de99aedc7d9330891d806076"
- integrity sha512-j3VydgncUG8HP6AZala6GTIt3V01nptodnnOke3JMYLqgk8EJ1LOVOdotK9pXi80o7EmmNKFs/LyyH8z+uAJzQ==
+metro-babel-register@^0.56.0, metro-babel-register@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.56.4.tgz#b0c627a1cfdd1bdd768f81af79481754e833a902"
+ integrity sha512-Phm6hMluOWYqfykftjJ1jsTpWvbgb49AC/1taxEctxUdRCZlFgZwBleJZAhQYxJD5J+ikFkEbHDzePEXb29KVA==
dependencies:
"@babel/core" "^7.0.0"
"@babel/plugin-proposal-class-properties" "^7.0.0"
@@ -4129,56 +4263,50 @@ metro-babel-register@0.54.1:
core-js "^2.2.2"
escape-string-regexp "^1.0.5"
-metro-babel-transformer@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.54.1.tgz#371ffa2d1118b22cc9e40b3c3ea6738c49dae9dc"
- integrity sha512-2aiAnuYBdcLV1VINb8ENAA4keIaJIepHgR9+iRvIde+9GSjKnexqx4nNmJN392285gRDp1fVZ7uY0uQawK/A5g==
+metro-babel-transformer@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.56.4.tgz#fe1d0dc600fcf90201a5bea4d42caea10b801057"
+ integrity sha512-IOi4ILgZvaX7GCGHBJp79paNVOq5QxhhbyqAdEJgDP8bHfl/OVHoVKSypfrsMSKSiBrqxhIjyc4XjkXsQtkx5g==
dependencies:
"@babel/core" "^7.0.0"
+ metro-source-map "^0.56.4"
-metro-babel7-plugin-react-transform@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.54.1.tgz#5335b810284789724886dc483d5bde9c149a1996"
- integrity sha512-jWm5myuMoZAOhoPsa8ItfDxdTcOzKhTTzzhFlbZnRamE7i9qybeMdrZt8KHQpF7i2p/mKzE9Yhf4ouOz5K/jHg==
- dependencies:
- "@babel/helper-module-imports" "^7.0.0"
-
-metro-cache@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.54.1.tgz#2e9017cbd11106837b8c385c9eb8c8175469a8c1"
- integrity sha512-RxCFoNcANHXZYi4MIQNnqh68gUnC3bMpzCFJY5pBoqqdrkkn8ibYglBweA0/DW7hx1OZTJWelwS1Dp8xxmE2CA==
+metro-cache@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.56.4.tgz#542f9f8a35f8fb9d5576f46fd3ab4d4f42851a7e"
+ integrity sha512-d1hiUSKwtRsuMxUhHVJ3tjK2BbpUlJGvTyMWohK8Wxx+0GbnWRWWFcI4vlCzlZfoK0VtZK2MJEl5t7Du1mIniQ==
dependencies:
jest-serializer "^24.4.0"
- metro-core "0.54.1"
+ metro-core "^0.56.4"
mkdirp "^0.5.1"
rimraf "^2.5.4"
-metro-config@0.54.1, metro-config@^0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.54.1.tgz#808b4e17625d9f4e9afa34232778fdf8e63cc8dd"
- integrity sha512-FpxrA+63rGkPGvGI653dvuSreJzU+eOTILItVnnhmqwn2SAK5V00N/qGTOIJe2YIuWEFXwCzw9lXmANrXbwuGg==
+metro-config@^0.56.0, metro-config@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.56.4.tgz#338fd8165fba59424cec427c1a881757945e57e9"
+ integrity sha512-O85QDHwWdMn/8ERe13y4a6vbZL0AHyO8atTvL+9BCulLEO+FQBi1iJjr3+ViLa8cf0m5dRftDsa7P47m5euk4A==
dependencies:
cosmiconfig "^5.0.5"
jest-validate "^24.7.0"
- metro "0.54.1"
- metro-cache "0.54.1"
- metro-core "0.54.1"
+ metro "^0.56.4"
+ metro-cache "^0.56.4"
+ metro-core "^0.56.4"
pretty-format "^24.7.0"
-metro-core@0.54.1, metro-core@^0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.54.1.tgz#17f6ecc167918da8819d4af5726349e55714954b"
- integrity sha512-8oz3Ck7QFBzW9dG9tKFhrXHKPu2Ajx3R7eatf61Gl6Jf/tF7PNouv3wHxPsJW3oXDFiwKLszd89+OgleTGkB5g==
+metro-core@^0.56.0, metro-core@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.56.4.tgz#67cc41b3c0bf66e9c2306f50239a1080b1e82312"
+ integrity sha512-hMzkBdgPt5Zm9nr/1KtIT+A6H7TNiLVCEGG5OiAXj8gTRsA2yy7wAdQpwy0xbE+zi88t/pLOzXpd3ClG/YxyWg==
dependencies:
jest-haste-map "^24.7.1"
lodash.throttle "^4.1.1"
- metro-resolver "0.54.1"
+ metro-resolver "^0.56.4"
wordwrap "^1.0.0"
-metro-inspector-proxy@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.54.1.tgz#0ef48ee3feb11c6da47aa100151a9bf2a7c358ee"
- integrity sha512-sf6kNu7PgFW6U+hU7YGZfbAUKAPVvCJhY8YVu/A1RMKH9nNULrCo+jlWh0gWgmFfWRQiAPCElevROg+5somk8A==
+metro-inspector-proxy@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.56.4.tgz#7343ff3c5908af4fd99e96b6d646e24e99816be4"
+ integrity sha512-E1S3MO25mWKmcLn1UQuCDiS0hf9P2Fwq8sEAX5lBLoZbehepNH+4xJ3xXSY51JX4dozBrE8GGoKL4ll3II40LA==
dependencies:
connect "^3.6.5"
debug "^2.2.0"
@@ -4186,55 +4314,13 @@ metro-inspector-proxy@0.54.1:
ws "^1.1.5"
yargs "^9.0.0"
-metro-minify-uglify@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.54.1.tgz#54ed1cb349245ce82dba8cc662bbf69fbca142c3"
- integrity sha512-z+pOPna/8IxD4OhjW6Xo1mV2EszgqqQHqBm1FdmtdF6IpWkQp33qpDBNEi9NGZTOr7pp2bvcxZnvNJdC2lrK9Q==
+metro-minify-uglify@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.56.4.tgz#13589dfb1d43343608aacb7f78ddfcc052daa63c"
+ integrity sha512-BHgj7+BKEK2pHvWHUR730bIrsZwl8DPtr49x9L0j2grPZ5/UROWXzEr8VZgIss7fl64t845uu1HXNNyuSj2EhA==
dependencies:
uglify-es "^3.1.9"
-metro-react-native-babel-preset@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz#b8f03865c381841d7f8912e7ba46804ea3a928b8"
- integrity sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g==
- dependencies:
- "@babel/plugin-proposal-class-properties" "^7.0.0"
- "@babel/plugin-proposal-export-default-from" "^7.0.0"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0"
- "@babel/plugin-proposal-object-rest-spread" "^7.0.0"
- "@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
- "@babel/plugin-proposal-optional-chaining" "^7.0.0"
- "@babel/plugin-syntax-dynamic-import" "^7.0.0"
- "@babel/plugin-syntax-export-default-from" "^7.0.0"
- "@babel/plugin-syntax-flow" "^7.2.0"
- "@babel/plugin-transform-arrow-functions" "^7.0.0"
- "@babel/plugin-transform-block-scoping" "^7.0.0"
- "@babel/plugin-transform-classes" "^7.0.0"
- "@babel/plugin-transform-computed-properties" "^7.0.0"
- "@babel/plugin-transform-destructuring" "^7.0.0"
- "@babel/plugin-transform-exponentiation-operator" "^7.0.0"
- "@babel/plugin-transform-flow-strip-types" "^7.0.0"
- "@babel/plugin-transform-for-of" "^7.0.0"
- "@babel/plugin-transform-function-name" "^7.0.0"
- "@babel/plugin-transform-literals" "^7.0.0"
- "@babel/plugin-transform-modules-commonjs" "^7.0.0"
- "@babel/plugin-transform-object-assign" "^7.0.0"
- "@babel/plugin-transform-parameters" "^7.0.0"
- "@babel/plugin-transform-react-display-name" "^7.0.0"
- "@babel/plugin-transform-react-jsx" "^7.0.0"
- "@babel/plugin-transform-react-jsx-source" "^7.0.0"
- "@babel/plugin-transform-regenerator" "^7.0.0"
- "@babel/plugin-transform-runtime" "^7.0.0"
- "@babel/plugin-transform-shorthand-properties" "^7.0.0"
- "@babel/plugin-transform-spread" "^7.0.0"
- "@babel/plugin-transform-sticky-regex" "^7.0.0"
- "@babel/plugin-transform-template-literals" "^7.0.0"
- "@babel/plugin-transform-typescript" "^7.0.0"
- "@babel/plugin-transform-unicode-regex" "^7.0.0"
- "@babel/template" "^7.0.0"
- metro-babel7-plugin-react-transform "0.54.1"
- react-transform-hmr "^1.0.4"
-
metro-react-native-babel-preset@^0.56.0:
version "0.56.0"
resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.0.tgz#fa47dfd5f7678e89cffd1249020b8add6938fc48"
@@ -4276,59 +4362,93 @@ metro-react-native-babel-preset@^0.56.0:
"@babel/template" "^7.0.0"
react-refresh "^0.4.0"
-metro-react-native-babel-transformer@0.54.1, metro-react-native-babel-transformer@^0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.54.1.tgz#45b56db004421134e10e739f69e8de50775fef17"
- integrity sha512-ECw7xG91t8dk/PHdiyoC5SP1s9OQzfmJzG5m0YOZaKtHMe534qTDbncxaKfTI3CP99yti2maXFBRVj+xyvph/g==
+metro-react-native-babel-preset@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.4.tgz#dcedc64b7ff5c0734839458e70eb0ebef6d063a8"
+ integrity sha512-CzbBDM9Rh6w8s1fq+ZqihAh7DDqUAcfo9pPww25+N/eJ7UK436Q7JdfxwdIPpBwLFn6o6MyYn+uwL9OEWBJarA==
+ dependencies:
+ "@babel/plugin-proposal-class-properties" "^7.0.0"
+ "@babel/plugin-proposal-export-default-from" "^7.0.0"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.0.0"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.0.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.0.0"
+ "@babel/plugin-syntax-export-default-from" "^7.0.0"
+ "@babel/plugin-syntax-flow" "^7.2.0"
+ "@babel/plugin-transform-arrow-functions" "^7.0.0"
+ "@babel/plugin-transform-block-scoping" "^7.0.0"
+ "@babel/plugin-transform-classes" "^7.0.0"
+ "@babel/plugin-transform-computed-properties" "^7.0.0"
+ "@babel/plugin-transform-destructuring" "^7.0.0"
+ "@babel/plugin-transform-exponentiation-operator" "^7.0.0"
+ "@babel/plugin-transform-flow-strip-types" "^7.0.0"
+ "@babel/plugin-transform-for-of" "^7.0.0"
+ "@babel/plugin-transform-function-name" "^7.0.0"
+ "@babel/plugin-transform-literals" "^7.0.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.0.0"
+ "@babel/plugin-transform-object-assign" "^7.0.0"
+ "@babel/plugin-transform-parameters" "^7.0.0"
+ "@babel/plugin-transform-react-display-name" "^7.0.0"
+ "@babel/plugin-transform-react-jsx" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.0.0"
+ "@babel/plugin-transform-regenerator" "^7.0.0"
+ "@babel/plugin-transform-runtime" "^7.0.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.0.0"
+ "@babel/plugin-transform-spread" "^7.0.0"
+ "@babel/plugin-transform-sticky-regex" "^7.0.0"
+ "@babel/plugin-transform-template-literals" "^7.0.0"
+ "@babel/plugin-transform-typescript" "^7.0.0"
+ "@babel/plugin-transform-unicode-regex" "^7.0.0"
+ "@babel/template" "^7.0.0"
+ react-refresh "^0.4.0"
+
+metro-react-native-babel-transformer@^0.56.0:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.4.tgz#3c6e48b605c305362ee624e45ff338656e35fc1d"
+ integrity sha512-ng74eutuy1nyGI9+TDzzVAVfEmNPDlapV4msTQMKPi4EFqo/fBn7Ct33ME9l5E51pQBBnxt/UwcpTvd13b29kQ==
dependencies:
"@babel/core" "^7.0.0"
babel-preset-fbjs "^3.1.2"
- metro-babel-transformer "0.54.1"
- metro-react-native-babel-preset "0.54.1"
+ metro-babel-transformer "^0.56.4"
+ metro-react-native-babel-preset "^0.56.4"
+ metro-source-map "^0.56.4"
-metro-resolver@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.54.1.tgz#0295b38624b678b88b16bf11d47288845132b087"
- integrity sha512-Byv1LIawYAASy9CFRwzrncYnqaFGLe8vpw178EtzStqP05Hu6hXSqkNTrfoXa+3V9bPFGCrVzFx2NY3gFp2btg==
+metro-resolver@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.56.4.tgz#9876f57bca37fd1bfcffd733541e2ee4a89fad7f"
+ integrity sha512-Ug4ulVfpkKZ1Wu7mdYj9XLGuOqZTuWCqEhyx3siKTc/2eBwKZQXmiNo5d/IxWNvmwL/87Abeb724I6CMzMfjiQ==
dependencies:
absolute-path "^0.0.0"
-metro-source-map@0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.54.1.tgz#e17bad53c11978197d3c05c9168d799c2e04dcc5"
- integrity sha512-E9iSYMSUSq5qYi1R2hTQtxH4Mxjzfgr/jaSmQIWi7h3fG2P1qOZNNSzeaeUeTK+s2N/ksVlkcL5kMikol8CDrQ==
- dependencies:
- "@babel/traverse" "^7.0.0"
- "@babel/types" "^7.0.0"
- source-map "^0.5.6"
-
-metro-source-map@0.55.0, metro-source-map@^0.55.0:
- version "0.55.0"
- resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.55.0.tgz#1f6289905f08277c398f2b9b9c13e7e0e5a6f540"
- integrity sha512-HZODA0KPl5onJNGIztfTHHWurR2nL6Je/X8wwj+bL4ZBB/hSMVeDk7rWReCAvO3twVz7Ztp8Si0jfMmmH4Ruuw==
+metro-source-map@^0.56.0, metro-source-map@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.56.4.tgz#868ccac3f3519fe14eca358bc186f63651b2b9bc"
+ integrity sha512-f1P9/rpFmG3Z0Jatiw2zvLItx1TwR7mXTSDj4qLDCWeVMB3kEXAr3R0ucumTW8c6HfpJljeRBWzYFXF33fd81g==
dependencies:
"@babel/traverse" "^7.0.0"
"@babel/types" "^7.0.0"
invariant "^2.2.4"
- metro-symbolicate "0.55.0"
- ob1 "0.55.0"
+ metro-symbolicate "^0.56.4"
+ ob1 "^0.56.4"
source-map "^0.5.6"
vlq "^1.0.0"
-metro-symbolicate@0.55.0:
- version "0.55.0"
- resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.55.0.tgz#4086a2adae54b5e44a4911ca572d8a7b03c71fa1"
- integrity sha512-3r3Gpv5L4U7rBGpIqw5S1nun5MelfUMLRiScJsPRGZVTX3WY1w+zpaQKlWBi5yuHf5dMQ+ZUVbhb02IdrfJ2Fg==
+metro-symbolicate@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.56.4.tgz#53e9d40beac9049fa75a3e620ddd47d4907ff015"
+ integrity sha512-8mCNNn6zV5FFKCIcRgI7736Xl+owgvYuy8qanPxZN36f7utiWRYeB+PirEBPcglBk4qQvoy2lT6oPULNXZQbbQ==
dependencies:
- metro-source-map "0.55.0"
+ invariant "^2.2.4"
+ metro-source-map "^0.56.4"
source-map "^0.5.6"
through2 "^2.0.1"
vlq "^1.0.0"
-metro@0.54.1, metro@^0.54.1:
- version "0.54.1"
- resolved "https://registry.yarnpkg.com/metro/-/metro-0.54.1.tgz#a629be00abee5a450a25a8f71c24745f70cc9b44"
- integrity sha512-6ODPT4mEo4FCpbExRNnQAcZmf1VeNvYOTMj2Na03FjGqhNODHhI2U/wF/Ul5gqTyJ2dVdkXeyvKW3gl/LrnJRg==
+metro@^0.56.0, metro@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/metro/-/metro-0.56.4.tgz#be7e1380ee6ac3552c25ead8098eab261029e4d7"
+ integrity sha512-Kt3OQJQtQdts0JrKnyGdLpKHDjqYBgIfzvYrvfhmFCkKuZ8aqRlVnvpfjQ4/OBm0Fmm9NyyxbNRD9VIbj7WjnA==
dependencies:
"@babel/core" "^7.0.0"
"@babel/generator" "^7.0.0"
@@ -4357,21 +4477,21 @@ metro@0.54.1, metro@^0.54.1:
json-stable-stringify "^1.0.1"
lodash.throttle "^4.1.1"
merge-stream "^1.0.1"
- metro-babel-register "0.54.1"
- metro-babel-transformer "0.54.1"
- metro-cache "0.54.1"
- metro-config "0.54.1"
- metro-core "0.54.1"
- metro-inspector-proxy "0.54.1"
- metro-minify-uglify "0.54.1"
- metro-react-native-babel-preset "0.54.1"
- metro-resolver "0.54.1"
- metro-source-map "0.54.1"
+ metro-babel-register "^0.56.4"
+ metro-babel-transformer "^0.56.4"
+ metro-cache "^0.56.4"
+ metro-config "^0.56.4"
+ metro-core "^0.56.4"
+ metro-inspector-proxy "^0.56.4"
+ metro-minify-uglify "^0.56.4"
+ metro-react-native-babel-preset "^0.56.4"
+ metro-resolver "^0.56.4"
+ metro-source-map "^0.56.4"
+ metro-symbolicate "^0.56.4"
mime-types "2.1.11"
mkdirp "^0.5.1"
node-fetch "^2.2.0"
nullthrows "^1.1.0"
- react-transform-hmr "^1.0.4"
resolve "^1.5.0"
rimraf "^2.5.4"
serialize-error "^2.1.0"
@@ -4455,12 +4575,6 @@ mimic-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-min-document@^2.19.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
- dependencies:
- dom-walk "^0.1.0"
-
minimatch@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
@@ -4729,10 +4843,10 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-ob1@0.55.0:
- version "0.55.0"
- resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.55.0.tgz#e393b4ae786ef442b3ef2a298ab70d6ec353dbdd"
- integrity sha512-pfyiMVsUItl8WiRKMT15eCi662pCRAuYTq2+V3UpE+PpFErJI/TvRh/M/l/9TaLlbFr7krJ7gdl+FXJNcybmvw==
+ob1@^0.56.4:
+ version "0.56.4"
+ resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.56.4.tgz#c4acb3baa42f4993a44b35b2da7c8ef443dcccec"
+ integrity sha512-URgFof9z2wotiYFsqlydXtQfGV81gvBI2ODy64xfd3vPo+AYom5PVDX4t4zn23t/O+S2IxqApSQM8uJAybmz7w==
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
@@ -4939,6 +5053,13 @@ p-limit@^2.0.0:
dependencies:
p-try "^2.0.0"
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
@@ -4953,6 +5074,13 @@ p-locate@^3.0.0:
dependencies:
p-limit "^2.0.0"
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
p-reduce@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
@@ -5014,6 +5142,11 @@ path-exists@^3.0.0:
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -5124,6 +5257,16 @@ pretty-format@^24.7.0, pretty-format@^24.9.0:
ansi-styles "^3.2.0"
react-is "^16.8.4"
+pretty-format@^25.1.0:
+ version "25.5.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a"
+ integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==
+ dependencies:
+ "@jest/types" "^25.5.0"
+ ansi-regex "^5.0.0"
+ ansi-styles "^4.0.0"
+ react-is "^16.12.0"
+
private@^0.1.6:
version "0.1.7"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
@@ -5137,10 +5280,6 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-process@~0.5.1:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
-
progress@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -5160,7 +5299,7 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.3"
-prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -5215,11 +5354,7 @@ rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-deep-force-update@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz#f911b5be1d2a6fe387507dd6e9a767aa2924b4c7"
-
-react-devtools-core@^3.6.1:
+react-devtools-core@^3.6.3:
version "3.6.3"
resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.3.tgz#977d95b684c6ad28205f0c62e1e12c5f16675814"
integrity sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ==
@@ -5227,6 +5362,11 @@ react-devtools-core@^3.6.1:
shell-quote "^1.6.1"
ws "^3.3.1"
+react-is@^16.12.0:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
react-is@^16.8.1:
version "16.8.6"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
@@ -5238,21 +5378,40 @@ react-is@^16.8.4, react-is@^16.8.6:
integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==
"react-native-video@file:../..":
- version "5.0.1"
+ version "5.1.0-alpha8"
dependencies:
keymirror "^0.1.1"
- prop-types "^15.5.10"
- shaka-player "^2.4.4"
+ prop-types "^15.7.2"
+ shaka-player "^2.5.9"
-react-native@0.60.5:
- version "0.60.5"
- resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.60.5.tgz#3c1d9c06a0fbab9807220b6acac09488d39186ee"
- integrity sha512-cZwI0XzzihACN+7an1Dy46A83FRaAe2Xyd7laCalFFAppZIYeMVphZQWrVljJk5kIZBNtYG35TY1VsghQ0Oc2Q==
+react-native-windows@^0.61.0-0:
+ version "0.61.15"
+ resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.61.15.tgz#523c904245ae764fa0e2c6b56b259e0ef0be6d3f"
+ integrity sha512-LSjUoNoLC1z76FsyRnKpEQQWupjsie918mryfHYddhWuZrdkKrqye043sgx1S/QayBbBH+1vMRNmwGtRqNxt0w==
+ dependencies:
+ "@babel/runtime" "^7.4.0"
+ cli-spinners "^2.2.0"
+ create-react-class "^15.6.3"
+ envinfo "^7.5.0"
+ fbjs "^1.0.0"
+ glob "^7.1.1"
+ ora "^3.4.0"
+ prop-types "^15.7.2"
+ regenerator-runtime "^0.13.2"
+ shelljs "^0.7.8"
+ username "^5.1.0"
+ uuid "^3.3.2"
+ xml-parser "^1.2.1"
+
+react-native@0.61.5:
+ version "0.61.5"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.61.5.tgz#6e21acb56cbd75a3baeb1f70201a66f42600bba8"
+ integrity sha512-MXqE3NoGO0T3dUKIKkIppijBhRRMpfN6ANbhMXHDuyfA+fSilRWgCwYgR/YNCC7ntECoJYikKaNTUBB0DeQy6Q==
dependencies:
"@babel/runtime" "^7.0.0"
- "@react-native-community/cli" "^2.6.0"
- "@react-native-community/cli-platform-android" "^2.6.0"
- "@react-native-community/cli-platform-ios" "^2.4.1"
+ "@react-native-community/cli" "^3.0.0"
+ "@react-native-community/cli-platform-android" "^3.0.0"
+ "@react-native-community/cli-platform-ios" "^3.0.0"
abort-controller "^3.0.0"
art "^0.10.0"
base64-js "^1.1.2"
@@ -5262,29 +5421,23 @@ react-native@0.60.5:
event-target-shim "^5.0.1"
fbjs "^1.0.0"
fbjs-scripts "^1.1.0"
- hermesvm "^0.1.0"
+ hermes-engine "^0.2.1"
invariant "^2.2.4"
- jsc-android "245459.0.0"
- metro-babel-register "0.54.1"
- metro-react-native-babel-transformer "0.54.1"
- metro-source-map "^0.55.0"
+ jsc-android "^245459.0.0"
+ metro-babel-register "^0.56.0"
+ metro-react-native-babel-transformer "^0.56.0"
+ metro-source-map "^0.56.0"
nullthrows "^1.1.0"
pretty-format "^24.7.0"
promise "^7.1.1"
prop-types "^15.7.2"
- react-devtools-core "^3.6.1"
+ react-devtools-core "^3.6.3"
+ react-refresh "^0.4.0"
regenerator-runtime "^0.13.2"
- scheduler "0.14.0"
+ scheduler "0.15.0"
stacktrace-parser "^0.1.3"
whatwg-fetch "^3.0.0"
-react-proxy@^1.1.7:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a"
- dependencies:
- lodash "^4.6.1"
- react-deep-force-update "^1.0.0"
-
react-refresh@^0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.2.tgz#54a277a6caaac2803d88f1d6f13c1dcfbd81e334"
@@ -5300,17 +5453,10 @@ react-test-renderer@16.8.6:
react-is "^16.8.6"
scheduler "^0.13.6"
-react-transform-hmr@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb"
- dependencies:
- global "^4.3.0"
- react-proxy "^1.1.7"
-
-react@16.9.0:
- version "16.9.0"
- resolved "https://registry.yarnpkg.com/react/-/react-16.9.0.tgz#40ba2f9af13bc1a38d75dbf2f4359a5185c4f7aa"
- integrity sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==
+react@^16.12.0:
+ version "16.14.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d"
+ integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
@@ -5382,6 +5528,13 @@ realpath-native@^1.1.0:
dependencies:
util.promisify "^1.0.0"
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
+ dependencies:
+ resolve "^1.1.6"
+
regenerate-unicode-properties@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
@@ -5399,6 +5552,11 @@ regenerator-runtime@^0.13.2:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
+regenerator-runtime@^0.13.4:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
regenerator-transform@^0.14.0:
version "0.14.1"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb"
@@ -5538,6 +5696,14 @@ resolve@1.1.7:
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
+resolve@^1.1.6:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
+ integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
+ dependencies:
+ is-core-module "^2.1.0"
+ path-parse "^1.0.6"
+
resolve@^1.3.2, resolve@^1.5.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232"
@@ -5667,10 +5833,10 @@ sax@^1.2.1, sax@^1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-scheduler@0.14.0:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.14.0.tgz#b392c23c9c14bfa2933d4740ad5603cc0d59ea5b"
- integrity sha512-9CgbS06Kki2f4R9FjLSITjZo5BZxPsryiRNyL3LpvrM9WxcVmhlqAOc9E+KQbeI2nqej4JIIbOsfdL51cNb4Iw==
+scheduler@0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e"
+ integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
@@ -5683,7 +5849,7 @@ scheduler@^0.13.6:
loose-envify "^1.1.0"
object-assign "^4.1.1"
-"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0:
+"semver@2 || 3 || 4 || 5", semver@^5.1.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -5702,7 +5868,7 @@ semver@^5.5.1, semver@^5.6.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-semver@^6.0.0, semver@^6.1.2, semver@^6.2.0:
+semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@@ -5774,10 +5940,12 @@ setprototypeof@1.1.1:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
-shaka-player@^2.4.4:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.2.tgz#3e639f8f5dfdb1a0afff2ff1f87cddf481f93fe4"
- integrity sha512-gpRfXVLAZi33kw9Egop18MkZ/EVRS0soeN6ocR+Btq/J5IoCC56MxwwHzAGna+PgBW9Ox458HRefJ6HB0BoADA==
+shaka-player@^2.5.9:
+ version "2.5.18"
+ resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.18.tgz#5382d0b879ade01dc7cea5115d311d2168b7428a"
+ integrity sha512-kW6sNMl36E4ookOcAo7//D/+sNkKNw7kBCR58AAC0eYw+fpVXwUbFoN/aqsj5nhACZ00QGQQajTZXZyK1s8Dow==
+ dependencies:
+ eme-encryption-scheme-polyfill "^2.0.1"
shebang-command@^1.2.0:
version "1.2.0"
@@ -5800,6 +5968,15 @@ shell-quote@1.6.1, shell-quote@^1.6.1:
array-reduce "~0.0.0"
jsonify "~0.0.0"
+shelljs@^0.7.8:
+ version "0.7.8"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
+ integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM=
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
shellwords@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
@@ -6081,6 +6258,11 @@ strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+sudo-prompt@^9.0.0:
+ version "9.2.1"
+ resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd"
+ integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==
+
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -6095,6 +6277,13 @@ supports-color@^6.1.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
symbol-observable@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
@@ -6380,6 +6569,14 @@ use@^3.1.0:
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+username@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/username/-/username-5.1.0.tgz#a7f9325adce2d0166448cdd55d4985b1360f2508"
+ integrity sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==
+ dependencies:
+ execa "^1.0.0"
+ mem "^4.3.0"
+
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -6615,6 +6812,13 @@ xml-name-validator@^3.0.0:
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+xml-parser@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/xml-parser/-/xml-parser-1.2.1.tgz#c31f4c34f2975db82ad013222120592736156fcd"
+ integrity sha1-wx9MNPKXXbgq0BMiISBZJzYVb80=
+ dependencies:
+ debug "^2.2.0"
+
xmlbuilder@^9.0.7:
version "9.0.7"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
diff --git a/ios/Video/RCTVideo.h b/ios/Video/RCTVideo.h
index 26d436c2..6fee2996 100644
--- a/ios/Video/RCTVideo.h
+++ b/ios/Video/RCTVideo.h
@@ -14,11 +14,11 @@
@class RCTEventDispatcher;
#if __has_include()
-@interface RCTVideo : UIView
+@interface RCTVideo : UIView
#elif TARGET_OS_TV
-@interface RCTVideo : UIView
+@interface RCTVideo : UIView
#else
-@interface RCTVideo : UIView
+@interface RCTVideo : UIView
#endif
@property (nonatomic, copy) RCTDirectEventBlock onVideoLoadStart;
@@ -42,11 +42,26 @@
@property (nonatomic, copy) RCTDirectEventBlock onVideoExternalPlaybackChange;
@property (nonatomic, copy) RCTDirectEventBlock onPictureInPictureStatusChanged;
@property (nonatomic, copy) RCTDirectEventBlock onRestoreUserInterfaceForPictureInPictureStop;
+@property (nonatomic, copy) RCTDirectEventBlock onGetLicense;
+
+typedef NS_ENUM(NSInteger, RCTVideoError) {
+ RCTVideoErrorFromJSPart,
+ RCTVideoErrorLicenseRequestNotOk,
+ RCTVideoErrorNoDataFromLicenseRequest,
+ RCTVideoErrorNoSPC,
+ RCTVideoErrorNoDataRequest,
+ RCTVideoErrorNoCertificateData,
+ RCTVideoErrorNoCertificateURL,
+ RCTVideoErrorNoFairplayDRM,
+ RCTVideoErrorNoDRMData
+};
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher NS_DESIGNATED_INITIALIZER;
- (AVPlayerViewController*)createPlayerViewController:(AVPlayer*)player withPlayerItem:(AVPlayerItem*)playerItem;
- (void)save:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
+- (void)setLicenseResult:(NSString * )license;
+- (BOOL)setLicenseResultError:(NSString * )error;
@end
diff --git a/ios/Video/RCTVideo.m b/ios/Video/RCTVideo.m
index 01e1b1c6..989167a6 100644
--- a/ios/Video/RCTVideo.m
+++ b/ios/Video/RCTVideo.m
@@ -33,6 +33,12 @@ static int const RCTVideoUnset = -1;
BOOL _playerLayerObserverSet;
RCTVideoPlayerViewController *_playerViewController;
NSURL *_videoURL;
+ BOOL _requestingCertificate;
+ BOOL _requestingCertificateErrored;
+
+ /* DRM */
+ NSDictionary *_drm;
+ AVAssetResourceLoadingRequest *_loadingRequest;
/* Required to publish events */
RCTEventDispatcher *_eventDispatcher;
@@ -146,14 +152,14 @@ static int const RCTVideoUnset = -1;
- (RCTVideoPlayerViewController*)createPlayerViewController:(AVPlayer*)player
withPlayerItem:(AVPlayerItem*)playerItem {
- RCTVideoPlayerViewController* viewController = [[RCTVideoPlayerViewController alloc] init];
- viewController.showsPlaybackControls = YES;
- viewController.rctDelegate = self;
- viewController.preferredOrientation = _fullscreenOrientation;
-
- viewController.view.frame = self.bounds;
- viewController.player = player;
- return viewController;
+ RCTVideoPlayerViewController* viewController = [[RCTVideoPlayerViewController alloc] init];
+ viewController.showsPlaybackControls = YES;
+ viewController.rctDelegate = self;
+ viewController.preferredOrientation = _fullscreenOrientation;
+
+ viewController.view.frame = self.bounds;
+ viewController.player = player;
+ return viewController;
}
/* ---------------------------------------------------------
@@ -247,11 +253,11 @@ static int const RCTVideoUnset = -1;
- (void)audioRouteChanged:(NSNotification *)notification
{
- NSNumber *reason = [[notification userInfo] objectForKey:AVAudioSessionRouteChangeReasonKey];
- NSNumber *previousRoute = [[notification userInfo] objectForKey:AVAudioSessionRouteChangePreviousRouteKey];
- if (reason.unsignedIntValue == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
- self.onVideoAudioBecomingNoisy(@{@"target": self.reactTag});
- }
+ NSNumber *reason = [[notification userInfo] objectForKey:AVAudioSessionRouteChangeReasonKey];
+ NSNumber *previousRoute = [[notification userInfo] objectForKey:AVAudioSessionRouteChangePreviousRouteKey];
+ if (reason.unsignedIntValue == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
+ self.onVideoAudioBecomingNoisy(@{@"target": self.reactTag});
+ }
}
#pragma mark - Progress
@@ -354,16 +360,16 @@ static int const RCTVideoUnset = -1;
[self removePlayerLayer];
[self removePlayerTimeObserver];
[self removePlayerItemObservers];
-
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) 0), dispatch_get_main_queue(), ^{
-
+
// perform on next run loop, otherwise other passed react-props may not be set
- [self playerItemForSource:source withCallback:^(AVPlayerItem * playerItem) {
+ [self playerItemForSource:self->_source withCallback:^(AVPlayerItem * playerItem) {
+ self->_playerItem = playerItem;
_playerItem = playerItem;
[self setPreferredForwardBufferDuration:_preferredForwardBufferDuration];
[self addPlayerItemObservers];
- [self setFilter:_filterName];
- [self setMaxBitRate:_maxBitRate];
+ [self setFilter:self->_filterName];
+ [self setMaxBitRate:self->_maxBitRate];
[_player pause];
@@ -371,20 +377,20 @@ static int const RCTVideoUnset = -1;
[_player removeObserver:self forKeyPath:playbackRate context:nil];
_playbackRateObserverRegistered = NO;
}
- if (_isExternalPlaybackActiveObserverRegistered) {
- [_player removeObserver:self forKeyPath:externalPlaybackActive context:nil];
- _isExternalPlaybackActiveObserverRegistered = NO;
+ if (self->_isExternalPlaybackActiveObserverRegistered) {
+ [self->_player removeObserver:self forKeyPath:externalPlaybackActive context:nil];
+ self->_isExternalPlaybackActiveObserverRegistered = NO;
}
-
- _player = [AVPlayer playerWithPlayerItem:_playerItem];
- _player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
-
- [_player addObserver:self forKeyPath:playbackRate options:0 context:nil];
- _playbackRateObserverRegistered = YES;
- [_player addObserver:self forKeyPath:externalPlaybackActive options:0 context:nil];
- _isExternalPlaybackActiveObserverRegistered = YES;
-
+ self->_player = [AVPlayer playerWithPlayerItem:self->_playerItem];
+ self->_player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
+
+ [self->_player addObserver:self forKeyPath:playbackRate options:0 context:nil];
+ self->_playbackRateObserverRegistered = YES;
+
+ [self->_player addObserver:self forKeyPath:externalPlaybackActive options:0 context:nil];
+ self->_isExternalPlaybackActiveObserverRegistered = YES;
+
[self addPlayerTimeObserver];
if (@available(iOS 10.0, *)) {
[self setAutomaticallyWaitsToMinimizeStalling:_automaticallyWaitsToMinimizeStalling];
@@ -392,13 +398,14 @@ static int const RCTVideoUnset = -1;
//Perform on next run loop, otherwise onVideoLoadStart is nil
if (self.onVideoLoadStart) {
- id uri = [source objectForKey:@"uri"];
- id type = [source objectForKey:@"type"];
+ id uri = [self->_source objectForKey:@"uri"];
+ id type = [self->_source objectForKey:@"type"];
self.onVideoLoadStart(@{@"src": @{
- @"uri": uri ? uri : [NSNull null],
- @"type": type ? type : [NSNull null],
- @"isNetwork": [NSNumber numberWithBool:(bool)[source objectForKey:@"isNetwork"]]},
- @"target": self.reactTag
+ @"uri": uri ? uri : [NSNull null],
+ @"type": type ? type : [NSNull null],
+ @"isNetwork": [NSNumber numberWithBool:(bool)[self->_source objectForKey:@"isNetwork"]]},
+ @"drm": self->_drm ? self->_drm : [NSNull null],
+ @"target": self.reactTag
});
}
}];
@@ -406,6 +413,10 @@ static int const RCTVideoUnset = -1;
_videoLoadStarted = YES;
}
+- (void)setDrm:(NSDictionary *)drm {
+ _drm = drm;
+}
+
- (NSURL*) urlFilePath:(NSString*) filepath {
if ([filepath containsString:@"file://"]) {
return [NSURL URLWithString:filepath];
@@ -436,7 +447,7 @@ static int const RCTVideoUnset = -1;
// AVPlayer can't airplay AVMutableCompositions
_allowsExternalPlayback = NO;
-
+
// sideload text tracks
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
@@ -477,7 +488,7 @@ static int const RCTVideoUnset = -1;
if (validTextTracks.count != _textTracks.count) {
[self setTextTracks:validTextTracks];
}
-
+
handler([AVPlayerItem playerItemWithAsset:mixComposition]);
}
@@ -488,11 +499,12 @@ static int const RCTVideoUnset = -1;
bool shouldCache = [RCTConvert BOOL:[source objectForKey:@"shouldCache"]];
NSString *uri = [source objectForKey:@"uri"];
NSString *type = [source objectForKey:@"type"];
+ AVURLAsset *asset;
if (!uri || [uri isEqualToString:@""]) {
DebugLog(@"Could not find video URL in source '%@'", source);
return;
}
-
+
NSURL *url = isNetwork || isAsset
? [NSURL URLWithString:uri]
: [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:uri ofType:type]];
@@ -505,7 +517,7 @@ static int const RCTVideoUnset = -1;
}
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
[assetOptions setObject:cookies forKey:AVURLAssetHTTPCookiesKey];
-
+
#if __has_include()
if (shouldCache && (!_textTracks || !_textTracks.count)) {
/* The DVURLAsset created by cache doesn't have a tracksWithMediaType property, so trying
@@ -517,61 +529,69 @@ static int const RCTVideoUnset = -1;
return;
}
#endif
-
- AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:assetOptions];
- [self playerItemPrepareText:asset assetOptions:assetOptions withCallback:handler];
- return;
+
+ asset = [AVURLAsset URLAssetWithURL:url options:assetOptions];
} else if (isAsset) {
- AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
- [self playerItemPrepareText:asset assetOptions:assetOptions withCallback:handler];
- return;
+ asset = [AVURLAsset URLAssetWithURL:url options:nil];
+ } else {
+ asset = [AVURLAsset URLAssetWithURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:uri ofType:type]] options:nil];
}
-
- AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:uri ofType:type]] options:nil];
+ // Reset _loadingRequest
+ if (_loadingRequest != nil) {
+ [_loadingRequest finishLoading];
+ }
+ _requestingCertificate = NO;
+ _requestingCertificateErrored = NO;
+ // End Reset _loadingRequest
+ if (self->_drm != nil) {
+ dispatch_queue_t queue = dispatch_queue_create("assetQueue", nil);
+ [asset.resourceLoader setDelegate:self queue:queue];
+ }
+
[self playerItemPrepareText:asset assetOptions:assetOptions withCallback:handler];
}
#if __has_include()
- (void)playerItemForSourceUsingCache:(NSString *)uri assetOptions:(NSDictionary *)options withCallback:(void(^)(AVPlayerItem *))handler {
- NSURL *url = [NSURL URLWithString:uri];
- [_videoCache getItemForUri:uri withCallback:^(RCTVideoCacheStatus videoCacheStatus, AVAsset * _Nullable cachedAsset) {
- switch (videoCacheStatus) {
- case RCTVideoCacheStatusMissingFileExtension: {
- DebugLog(@"Could not generate cache key for uri '%@'. It is currently not supported to cache urls that do not include a file extension. The video file will not be cached. Checkout https://github.com/react-native-community/react-native-video/blob/master/docs/caching.md", uri);
- AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:options];
- [self playerItemPrepareText:asset assetOptions:options withCallback:handler];
- return;
- }
- case RCTVideoCacheStatusUnsupportedFileExtension: {
- DebugLog(@"Could not generate cache key for uri '%@'. The file extension of that uri is currently not supported. The video file will not be cached. Checkout https://github.com/react-native-community/react-native-video/blob/master/docs/caching.md", uri);
- AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:options];
- [self playerItemPrepareText:asset assetOptions:options withCallback:handler];
- return;
- }
- default:
- if (cachedAsset) {
- DebugLog(@"Playing back uri '%@' from cache", uri);
- // See note in playerItemForSource about not being able to support text tracks & caching
- handler([AVPlayerItem playerItemWithAsset:cachedAsset]);
- return;
- }
+ NSURL *url = [NSURL URLWithString:uri];
+ [_videoCache getItemForUri:uri withCallback:^(RCTVideoCacheStatus videoCacheStatus, AVAsset * _Nullable cachedAsset) {
+ switch (videoCacheStatus) {
+ case RCTVideoCacheStatusMissingFileExtension: {
+ DebugLog(@"Could not generate cache key for uri '%@'. It is currently not supported to cache urls that do not include a file extension. The video file will not be cached. Checkout https://github.com/react-native-community/react-native-video/blob/master/docs/caching.md", uri);
+ AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:options];
+ [self playerItemPrepareText:asset assetOptions:options withCallback:handler];
+ return;
+ }
+ case RCTVideoCacheStatusUnsupportedFileExtension: {
+ DebugLog(@"Could not generate cache key for uri '%@'. The file extension of that uri is currently not supported. The video file will not be cached. Checkout https://github.com/react-native-community/react-native-video/blob/master/docs/caching.md", uri);
+ AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:options];
+ [self playerItemPrepareText:asset assetOptions:options withCallback:handler];
+ return;
+ }
+ default:
+ if (cachedAsset) {
+ DebugLog(@"Playing back uri '%@' from cache", uri);
+ // See note in playerItemForSource about not being able to support text tracks & caching
+ handler([AVPlayerItem playerItemWithAsset:cachedAsset]);
+ return;
}
-
- DVURLAsset *asset = [[DVURLAsset alloc] initWithURL:url options:options networkTimeout:10000];
- asset.loaderDelegate = self;
-
- /* More granular code to have control over the DVURLAsset
- DVAssetLoaderDelegate *resourceLoaderDelegate = [[DVAssetLoaderDelegate alloc] initWithURL:url];
- resourceLoaderDelegate.delegate = self;
- NSURLComponents *components = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO];
- components.scheme = [DVAssetLoaderDelegate scheme];
- AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[components URL] options:options];
- [asset.resourceLoader setDelegate:resourceLoaderDelegate queue:dispatch_get_main_queue()];
- */
-
- handler([AVPlayerItem playerItemWithAsset:asset]);
- }];
+ }
+
+ DVURLAsset *asset = [[DVURLAsset alloc] initWithURL:url options:options networkTimeout:10000];
+ asset.loaderDelegate = self;
+
+ /* More granular code to have control over the DVURLAsset
+ DVAssetLoaderDelegate *resourceLoaderDelegate = [[DVAssetLoaderDelegate alloc] initWithURL:url];
+ resourceLoaderDelegate.delegate = self;
+ NSURLComponents *components = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO];
+ components.scheme = [DVAssetLoaderDelegate scheme];
+ AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[components URL] options:options];
+ [asset.resourceLoader setDelegate:resourceLoaderDelegate queue:dispatch_get_main_queue()];
+ */
+
+ handler([AVPlayerItem playerItemWithAsset:asset]);
+ }];
}
#pragma mark - DVAssetLoaderDelegate
@@ -579,9 +599,9 @@ static int const RCTVideoUnset = -1;
- (void)dvAssetLoaderDelegate:(DVAssetLoaderDelegate *)loaderDelegate
didLoadData:(NSData *)data
forURL:(NSURL *)url {
- [_videoCache storeItem:data forUri:[url absoluteString] withCallback:^(BOOL success) {
- DebugLog(@"Cache data stored successfully 🎉");
- }];
+ [_videoCache storeItem:data forUri:[url absoluteString] withCallback:^(BOOL success) {
+ DebugLog(@"Cache data stored successfully 🎉");
+ }];
}
#endif
@@ -679,7 +699,10 @@ static int const RCTVideoUnset = -1;
[self applyModifiers];
} else if (_playerItem.status == AVPlayerItemStatusFailed && self.onVideoError) {
self.onVideoError(@{@"error": @{@"code": [NSNumber numberWithInteger: _playerItem.error.code],
- @"domain": _playerItem.error.domain},
+ @"localizedDescription": [_playerItem.error localizedDescription] == nil ? @"" : [_playerItem.error localizedDescription],
+ @"localizedFailureReason": [_playerItem.error localizedFailureReason] == nil ? @"" : [_playerItem.error localizedFailureReason],
+ @"localizedRecoverySuggestion": [_playerItem.error localizedRecoverySuggestion] == nil ? @"" : [_playerItem.error localizedRecoverySuggestion],
+ @"domain": _playerItem != nil && _playerItem.error != nil ? _playerItem.error.domain : @"RTCVideo"},
@"target": self.reactTag});
}
} else if ([keyPath isEqualToString:playbackBufferEmptyKeyPath]) {
@@ -708,10 +731,10 @@ static int const RCTVideoUnset = -1;
}
}
else if([keyPath isEqualToString:externalPlaybackActive]) {
- if(self.onVideoExternalPlaybackChange) {
- self.onVideoExternalPlaybackChange(@{@"isExternalPlaybackActive": [NSNumber numberWithBool:_player.isExternalPlaybackActive],
- @"target": self.reactTag});
- }
+ if(self.onVideoExternalPlaybackChange) {
+ self.onVideoExternalPlaybackChange(@{@"isExternalPlaybackActive": [NSNumber numberWithBool:_player.isExternalPlaybackActive],
+ @"target": self.reactTag});
+ }
}
} else if (object == _playerViewController.contentOverlayView) {
// when controls==true, this is a hack to reset the rootview when rotation happens in fullscreen
@@ -752,7 +775,7 @@ static int const RCTVideoUnset = -1;
selector:@selector(playbackStalled:)
name:AVPlayerItemPlaybackStalledNotification
object:nil];
-
+
[[NSNotificationCenter defaultCenter] removeObserver:self
name:AVPlayerItemNewAccessLogEntryNotification
object:nil];
@@ -760,18 +783,35 @@ static int const RCTVideoUnset = -1;
selector:@selector(handleAVPlayerAccess:)
name:AVPlayerItemNewAccessLogEntryNotification
object:nil];
-
+ [[NSNotificationCenter defaultCenter] removeObserver:self
+ name: AVPlayerItemFailedToPlayToEndTimeNotification
+ object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(didFailToFinishPlaying:)
+ name: AVPlayerItemFailedToPlayToEndTimeNotification
+ object:nil];
+
}
- (void)handleAVPlayerAccess:(NSNotification *)notification {
- AVPlayerItemAccessLog *accessLog = [((AVPlayerItem *)notification.object) accessLog];
- AVPlayerItemAccessLogEvent *lastEvent = accessLog.events.lastObject;
-
- /* TODO: get this working
- if (self.onBandwidthUpdate) {
- self.onBandwidthUpdate(@{@"bitrate": [NSNumber numberWithFloat:lastEvent.observedBitrate]});
- }
- */
+ AVPlayerItemAccessLog *accessLog = [((AVPlayerItem *)notification.object) accessLog];
+ AVPlayerItemAccessLogEvent *lastEvent = accessLog.events.lastObject;
+
+ /* TODO: get this working
+ if (self.onBandwidthUpdate) {
+ self.onBandwidthUpdate(@{@"bitrate": [NSNumber numberWithFloat:lastEvent.observedBitrate]});
+ }
+ */
+}
+
+- (void)didFailToFinishPlaying:(NSNotification *)notification {
+ NSError *error = notification.userInfo[AVPlayerItemFailedToPlayToEndTimeErrorKey];
+ self.onVideoError(@{@"error": @{@"code": [NSNumber numberWithInteger: error.code],
+ @"localizedDescription": [error localizedDescription] == nil ? @"" : [error localizedDescription],
+ @"localizedFailureReason": [error localizedFailureReason] == nil ? @"" : [error localizedFailureReason],
+ @"localizedRecoverySuggestion": [error localizedRecoverySuggestion] == nil ? @"" : [error localizedRecoverySuggestion],
+ @"domain": error.domain},
+ @"target": self.reactTag});
}
- (void)playbackStalled:(NSNotification *)notification
@@ -825,8 +865,8 @@ static int const RCTVideoUnset = -1;
- (void)setAllowsExternalPlayback:(BOOL)allowsExternalPlayback
{
- _allowsExternalPlayback = allowsExternalPlayback;
- _player.allowsExternalPlayback = _allowsExternalPlayback;
+ _allowsExternalPlayback = allowsExternalPlayback;
+ _player.allowsExternalPlayback = _allowsExternalPlayback;
}
- (void)setPlayWhenInactive:(BOOL)playWhenInactive
@@ -840,7 +880,7 @@ static int const RCTVideoUnset = -1;
if (_pictureInPicture == pictureInPicture) {
return;
}
-
+
_pictureInPicture = pictureInPicture;
if (_pipController && _pictureInPicture && ![_pipController isPictureInPictureActive]) {
dispatch_async(dispatch_get_main_queue(), ^{
@@ -849,7 +889,7 @@ static int const RCTVideoUnset = -1;
} else if (_pipController && !_pictureInPicture && [_pipController isPictureInPictureActive]) {
dispatch_async(dispatch_get_main_queue(), ^{
[_pipController stopPictureInPicture];
- });
+ });
}
#endif
}
@@ -1053,52 +1093,52 @@ static int const RCTVideoUnset = -1;
- (void)setMediaSelectionTrackForCharacteristic:(AVMediaCharacteristic)characteristic
withCriteria:(NSDictionary *)criteria
{
- NSString *type = criteria[@"type"];
- AVMediaSelectionGroup *group = [_player.currentItem.asset
- mediaSelectionGroupForMediaCharacteristic:characteristic];
- AVMediaSelectionOption *mediaOption;
+ NSString *type = criteria[@"type"];
+ AVMediaSelectionGroup *group = [_player.currentItem.asset
+ mediaSelectionGroupForMediaCharacteristic:characteristic];
+ AVMediaSelectionOption *mediaOption;
- if ([type isEqualToString:@"disabled"]) {
- // Do nothing. We want to ensure option is nil
- } else if ([type isEqualToString:@"language"] || [type isEqualToString:@"title"]) {
- NSString *value = criteria[@"value"];
- for (int i = 0; i < group.options.count; ++i) {
- AVMediaSelectionOption *currentOption = [group.options objectAtIndex:i];
- NSString *optionValue;
- if ([type isEqualToString:@"language"]) {
- optionValue = [currentOption extendedLanguageTag];
- } else {
- optionValue = [[[currentOption commonMetadata]
- valueForKey:@"value"]
- objectAtIndex:0];
- }
- if ([value isEqualToString:optionValue]) {
- mediaOption = currentOption;
- break;
- }
+ if ([type isEqualToString:@"disabled"]) {
+ // Do nothing. We want to ensure option is nil
+ } else if ([type isEqualToString:@"language"] || [type isEqualToString:@"title"]) {
+ NSString *value = criteria[@"value"];
+ for (int i = 0; i < group.options.count; ++i) {
+ AVMediaSelectionOption *currentOption = [group.options objectAtIndex:i];
+ NSString *optionValue;
+ if ([type isEqualToString:@"language"]) {
+ optionValue = [currentOption extendedLanguageTag];
+ } else {
+ optionValue = [[[currentOption commonMetadata]
+ valueForKey:@"value"]
+ objectAtIndex:0];
+ }
+ if ([value isEqualToString:optionValue]) {
+ mediaOption = currentOption;
+ break;
}
- //} else if ([type isEqualToString:@"default"]) {
- // option = group.defaultOption; */
- } else if ([type isEqualToString:@"index"]) {
- if ([criteria[@"value"] isKindOfClass:[NSNumber class]]) {
- int index = [criteria[@"value"] intValue];
- if (group.options.count > index) {
- mediaOption = [group.options objectAtIndex:index];
- }
- }
- } else { // default. invalid type or "system"
- [_player.currentItem selectMediaOptionAutomaticallyInMediaSelectionGroup:group];
- return;
}
+ //} else if ([type isEqualToString:@"default"]) {
+ // option = group.defaultOption; */
+ } else if ([type isEqualToString:@"index"]) {
+ if ([criteria[@"value"] isKindOfClass:[NSNumber class]]) {
+ int index = [criteria[@"value"] intValue];
+ if (group.options.count > index) {
+ mediaOption = [group.options objectAtIndex:index];
+ }
+ }
+ } else { // default. invalid type or "system"
+ [_player.currentItem selectMediaOptionAutomaticallyInMediaSelectionGroup:group];
+ return;
+ }
- // If a match isn't found, option will be nil and text tracks will be disabled
- [_player.currentItem selectMediaOption:mediaOption inMediaSelectionGroup:group];
+ // If a match isn't found, option will be nil and text tracks will be disabled
+ [_player.currentItem selectMediaOption:mediaOption inMediaSelectionGroup:group];
}
- (void)setSelectedAudioTrack:(NSDictionary *)selectedAudioTrack {
- _selectedAudioTrack = selectedAudioTrack;
- [self setMediaSelectionTrackForCharacteristic:AVMediaCharacteristicAudible
- withCriteria:_selectedAudioTrack];
+ _selectedAudioTrack = selectedAudioTrack;
+ [self setMediaSelectionTrackForCharacteristic:AVMediaCharacteristicAudible
+ withCriteria:_selectedAudioTrack];
}
- (void)setSelectedTextTrack:(NSDictionary *)selectedTextTrack {
@@ -1233,25 +1273,25 @@ static int const RCTVideoUnset = -1;
- (NSArray *)getAudioTrackInfo
{
- NSMutableArray *audioTracks = [[NSMutableArray alloc] init];
- AVMediaSelectionGroup *group = [_player.currentItem.asset
- mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicAudible];
- for (int i = 0; i < group.options.count; ++i) {
- AVMediaSelectionOption *currentOption = [group.options objectAtIndex:i];
- NSString *title = @"";
- NSArray *values = [[currentOption commonMetadata] valueForKey:@"value"];
- if (values.count > 0) {
- title = [values objectAtIndex:0];
- }
- NSString *language = [currentOption extendedLanguageTag] ? [currentOption extendedLanguageTag] : @"";
- NSDictionary *audioTrack = @{
- @"index": [NSNumber numberWithInt:i],
- @"title": title,
- @"language": language
- };
- [audioTracks addObject:audioTrack];
+ NSMutableArray *audioTracks = [[NSMutableArray alloc] init];
+ AVMediaSelectionGroup *group = [_player.currentItem.asset
+ mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicAudible];
+ for (int i = 0; i < group.options.count; ++i) {
+ AVMediaSelectionOption *currentOption = [group.options objectAtIndex:i];
+ NSString *title = @"";
+ NSArray *values = [[currentOption commonMetadata] valueForKey:@"value"];
+ if (values.count > 0) {
+ title = [values objectAtIndex:0];
}
- return audioTracks;
+ NSString *language = [currentOption extendedLanguageTag] ? [currentOption extendedLanguageTag] : @"";
+ NSDictionary *audioTrack = @{
+ @"index": [NSNumber numberWithInt:i],
+ @"title": title,
+ @"language": language
+ };
+ [audioTracks addObject:audioTrack];
+ }
+ return audioTracks;
}
- (NSArray *)getTextTrackInfo
@@ -1423,6 +1463,11 @@ static int const RCTVideoUnset = -1;
- (void)removePlayerLayer
{
+ if (_loadingRequest != nil) {
+ [_loadingRequest finishLoading];
+ }
+ _requestingCertificate = NO;
+ _requestingCertificateErrored = NO;
[_playerLayer removeFromSuperlayer];
if (_playerLayerObserverSet) {
[_playerLayer removeObserver:self forKeyPath:readyForDisplayKeyPath];
@@ -1461,29 +1506,29 @@ static int const RCTVideoUnset = -1;
}
- (void)setFilter:(NSString *)filterName {
- _filterName = filterName;
-
- if (!_filterEnabled) {
- return;
- } else if ([[_source objectForKey:@"uri"] rangeOfString:@"m3u8"].location != NSNotFound) {
- return; // filters don't work for HLS... return
- } else if (!_playerItem.asset) {
- return;
- }
-
- CIFilter *filter = [CIFilter filterWithName:filterName];
- _playerItem.videoComposition = [AVVideoComposition
- videoCompositionWithAsset:_playerItem.asset
- applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest *_Nonnull request) {
- if (filter == nil) {
- [request finishWithImage:request.sourceImage context:nil];
- } else {
- CIImage *image = request.sourceImage.imageByClampingToExtent;
- [filter setValue:image forKey:kCIInputImageKey];
- CIImage *output = [filter.outputImage imageByCroppingToRect:request.sourceImage.extent];
- [request finishWithImage:output context:nil];
- }
- }];
+ _filterName = filterName;
+
+ if (!_filterEnabled) {
+ return;
+ } else if ([[_source objectForKey:@"uri"] rangeOfString:@"m3u8"].location != NSNotFound) {
+ return; // filters don't work for HLS... return
+ } else if (!_playerItem.asset) {
+ return;
+ }
+
+ CIFilter *filter = [CIFilter filterWithName:filterName];
+ _playerItem.videoComposition = [AVVideoComposition
+ videoCompositionWithAsset:_playerItem.asset
+ applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest *_Nonnull request) {
+ if (filter == nil) {
+ [request finishWithImage:request.sourceImage context:nil];
+ } else {
+ CIImage *image = request.sourceImage.imageByClampingToExtent;
+ [filter setValue:image forKey:kCIInputImageKey];
+ CIImage *output = [filter.outputImage imageByCroppingToRect:request.sourceImage.extent];
+ [request finishWithImage:output context:nil];
+ }
+ }];
}
- (void)setFilterEnabled:(BOOL)filterEnabled {
@@ -1583,106 +1628,377 @@ static int const RCTVideoUnset = -1;
#pragma mark - Export
- (void)save:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
-
- AVAsset *asset = _playerItem.asset;
-
- if (asset != nil) {
-
- AVAssetExportSession *exportSession = [AVAssetExportSession
- exportSessionWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
-
- if (exportSession != nil) {
- NSString *path = nil;
- NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- path = [self generatePathInDirectory:[[self cacheDirectoryPath] stringByAppendingPathComponent:@"Videos"]
- withExtension:@".mp4"];
- NSURL *url = [NSURL fileURLWithPath:path];
- exportSession.outputFileType = AVFileTypeMPEG4;
- exportSession.outputURL = url;
- exportSession.videoComposition = _playerItem.videoComposition;
- exportSession.shouldOptimizeForNetworkUse = true;
- [exportSession exportAsynchronouslyWithCompletionHandler:^{
-
- switch ([exportSession status]) {
- case AVAssetExportSessionStatusFailed:
- reject(@"ERROR_COULD_NOT_EXPORT_VIDEO", @"Could not export video", exportSession.error);
- break;
- case AVAssetExportSessionStatusCancelled:
- reject(@"ERROR_EXPORT_SESSION_CANCELLED", @"Export session was cancelled", exportSession.error);
- break;
- default:
- resolve(@{@"uri": url.absoluteString});
- break;
- }
-
- }];
-
- } else {
-
- reject(@"ERROR_COULD_NOT_CREATE_EXPORT_SESSION", @"Could not create export session", nil);
-
+
+ AVAsset *asset = _playerItem.asset;
+
+ if (asset != nil) {
+
+ AVAssetExportSession *exportSession = [AVAssetExportSession
+ exportSessionWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
+
+ if (exportSession != nil) {
+ NSString *path = nil;
+ NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
+ path = [self generatePathInDirectory:[[self cacheDirectoryPath] stringByAppendingPathComponent:@"Videos"]
+ withExtension:@".mp4"];
+ NSURL *url = [NSURL fileURLWithPath:path];
+ exportSession.outputFileType = AVFileTypeMPEG4;
+ exportSession.outputURL = url;
+ exportSession.videoComposition = _playerItem.videoComposition;
+ exportSession.shouldOptimizeForNetworkUse = true;
+ [exportSession exportAsynchronouslyWithCompletionHandler:^{
+
+ switch ([exportSession status]) {
+ case AVAssetExportSessionStatusFailed:
+ reject(@"ERROR_COULD_NOT_EXPORT_VIDEO", @"Could not export video", exportSession.error);
+ break;
+ case AVAssetExportSessionStatusCancelled:
+ reject(@"ERROR_EXPORT_SESSION_CANCELLED", @"Export session was cancelled", exportSession.error);
+ break;
+ default:
+ resolve(@{@"uri": url.absoluteString});
+ break;
}
-
+
+ }];
+
} else {
-
- reject(@"ERROR_ASSET_NIL", @"Asset is nil", nil);
-
+
+ reject(@"ERROR_COULD_NOT_CREATE_EXPORT_SESSION", @"Could not create export session", nil);
+
}
+
+ } else {
+
+ reject(@"ERROR_ASSET_NIL", @"Asset is nil", nil);
+
+ }
+}
+
+- (void)setLicenseResult:(NSString *)license {
+ NSData *respondData = [self base64DataFromBase64String:license];
+ if (_loadingRequest != nil && respondData != nil) {
+ AVAssetResourceLoadingDataRequest *dataRequest = [_loadingRequest dataRequest];
+ [dataRequest respondWithData:respondData];
+ [_loadingRequest finishLoading];
+ } else {
+ [self setLicenseResultError:@"No data from JS license response"];
+ }
+}
+
+- (BOOL)setLicenseResultError:(NSString *)error {
+ if (_loadingRequest != nil) {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorFromJSPart
+ userInfo: @{
+ NSLocalizedDescriptionKey: error,
+ NSLocalizedFailureReasonErrorKey: error,
+ NSLocalizedRecoverySuggestionErrorKey: error
+ }
+ ];
+ [self finishLoadingWithError:licenseError];
+ }
+ return NO;
+}
+
+- (BOOL)finishLoadingWithError:(NSError *)error {
+ if (_loadingRequest && error != nil) {
+ NSError *licenseError = error;
+ [_loadingRequest finishLoadingWithError:licenseError];
+ if (self.onVideoError) {
+ self.onVideoError(@{@"error": @{@"code": [NSNumber numberWithInteger: error.code],
+ @"localizedDescription": [error localizedDescription] == nil ? @"" : [error localizedDescription],
+ @"localizedFailureReason": [error localizedFailureReason] == nil ? @"" : [error localizedFailureReason],
+ @"localizedRecoverySuggestion": [error localizedRecoverySuggestion] == nil ? @"" : [error localizedRecoverySuggestion],
+ @"domain": _playerItem.error == nil ? @"RCTVideo" : _playerItem.error.domain},
+ @"target": self.reactTag});
+ }
+ }
+ return NO;
}
- (BOOL)ensureDirExistsWithPath:(NSString *)path {
- BOOL isDir = NO;
- NSError *error;
- BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];
- if (!(exists && isDir)) {
- [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
- if (error) {
- return NO;
- }
+ BOOL isDir = NO;
+ NSError *error;
+ BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];
+ if (!(exists && isDir)) {
+ [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
+ if (error) {
+ return NO;
}
- return YES;
+ }
+ return YES;
}
- (NSString *)generatePathInDirectory:(NSString *)directory withExtension:(NSString *)extension {
- NSString *fileName = [[[NSUUID UUID] UUIDString] stringByAppendingString:extension];
- [self ensureDirExistsWithPath:directory];
- return [directory stringByAppendingPathComponent:fileName];
+ NSString *fileName = [[[NSUUID UUID] UUIDString] stringByAppendingString:extension];
+ [self ensureDirExistsWithPath:directory];
+ return [directory stringByAppendingPathComponent:fileName];
}
- (NSString *)cacheDirectoryPath {
- NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- return array[0];
+ NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
+ return array[0];
}
+#pragma mark - AVAssetResourceLoaderDelegate
+
+- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForRenewalOfRequestedResource:(AVAssetResourceRenewalRequest *)renewalRequest {
+ return [self loadingRequestHandling:renewalRequest];
+}
+
+- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest {
+ return [self loadingRequestHandling:loadingRequest];
+}
+
+- (void)resourceLoader:(AVAssetResourceLoader *)resourceLoader
+didCancelLoadingRequest:(AVAssetResourceLoadingRequest *)loadingRequest {
+ NSLog(@"didCancelLoadingRequest");
+}
+
+- (BOOL)loadingRequestHandling:(AVAssetResourceLoadingRequest *)loadingRequest {
+ if (self->_requestingCertificate) {
+ return YES;
+ } else if (self->_requestingCertificateErrored) {
+ return NO;
+ }
+ _loadingRequest = loadingRequest;
+ NSURL *url = loadingRequest.request.URL;
+ if (self->_drm != nil) {
+ NSString *contentId;
+ NSString *contentIdOverride = (NSString *)[self->_drm objectForKey:@"contentId"];
+ if (contentIdOverride != nil) {
+ contentId = contentIdOverride;
+ } else if (self.onGetLicense) {
+ contentId = url.host;
+ } else {
+ contentId = [url.absoluteString stringByReplacingOccurrencesOfString:@"skd://" withString:@""];
+ }
+ NSString *drmType = (NSString *)[self->_drm objectForKey:@"type"];
+ if ([drmType isEqualToString:@"fairplay"]) {
+ NSString *certificateStringUrl = (NSString *)[self->_drm objectForKey:@"certificateUrl"];
+ if (certificateStringUrl != nil) {
+ NSURL *certificateURL = [NSURL URLWithString:[certificateStringUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ NSData *certificateData = [NSData dataWithContentsOfURL:certificateURL];
+ if ([self->_drm objectForKey:@"base64Certificate"]) {
+ certificateData = [[NSData alloc] initWithBase64EncodedData:certificateData options:NSDataBase64DecodingIgnoreUnknownCharacters];
+ }
+
+ if (certificateData != nil) {
+ NSData *contentIdData;
+ if(self.onGetLicense) {
+ contentIdData = [contentId dataUsingEncoding:NSUTF8StringEncoding];
+ } else {
+ contentIdData = [NSData dataWithBytes: [contentId cStringUsingEncoding:NSUTF8StringEncoding] length:[contentId lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
+ }
+ AVAssetResourceLoadingDataRequest *dataRequest = [loadingRequest dataRequest];
+ if (dataRequest != nil) {
+ NSError *spcError = nil;
+ NSData *spcData = [loadingRequest streamingContentKeyRequestDataForApp:certificateData contentIdentifier:contentIdData options:nil error:&spcError];
+ // Request CKC to the server
+ NSString *licenseServer = (NSString *)[self->_drm objectForKey:@"licenseServer"];
+ if (spcError != nil) {
+ [self finishLoadingWithError:spcError];
+ self->_requestingCertificateErrored = YES;
+ }
+ if (spcData != nil) {
+ if(self.onGetLicense) {
+ NSString *base64Encoded = [spcData base64EncodedStringWithOptions:0];
+ self->_requestingCertificate = YES;
+ if (licenseServer == nil) {
+ licenseServer = @"";
+ }
+ self.onGetLicense(@{@"licenseUrl": licenseServer,
+ @"contentId": contentId,
+ @"spcBase64": base64Encoded,
+ @"target": self.reactTag}
+ );
+ } else if(licenseServer != nil) {
+ NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
+ [request setHTTPMethod:@"POST"];
+ [request setURL:[NSURL URLWithString:licenseServer]];
+ // HEADERS
+ NSDictionary *headers = (NSDictionary *)[self->_drm objectForKey:@"headers"];
+ if (headers != nil) {
+ for (NSString *key in headers) {
+ NSString *value = headers[key];
+ [request setValue:value forHTTPHeaderField:key];
+ }
+ }
+
+ if(self.onGetLicense) {
+ [request setHTTPBody: spcData];
+ } else {
+ NSString *spcEncoded = [spcData base64EncodedStringWithOptions:0];
+ NSString *spcUrlEncoded = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)spcEncoded, NULL, CFSTR("?=&+"), kCFStringEncodingUTF8));
+ NSString *post = [NSString stringWithFormat:@"spc=%@&%@", spcUrlEncoded, contentId];
+ NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
+ [request setHTTPBody: postData];
+ }
+
+ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
+ NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
+ NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
+ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
+ if (error != nil) {
+ NSLog(@"Error getting license from %@, HTTP status code %li", url, (long)[httpResponse statusCode]);
+ [self finishLoadingWithError:error];
+ self->_requestingCertificateErrored = YES;
+ } else {
+ if([httpResponse statusCode] != 200){
+ NSLog(@"Error getting license from %@, HTTP status code %li", url, (long)[httpResponse statusCode]);
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorLicenseRequestNotOk
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining license.",
+ NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"License server responded with status code %li", (long)[httpResponse statusCode]],
+ NSLocalizedRecoverySuggestionErrorKey: @"Did you send the correct data to the license Server? Is the server ok?"
+ }
+ ];
+ [self finishLoadingWithError:licenseError];
+ self->_requestingCertificateErrored = YES;
+ } else if (data != nil) {
+ if(self.onGetLicense) {
+ [dataRequest respondWithData:data];
+ } else {
+ NSData *decodedData = [[NSData alloc] initWithBase64EncodedData:data options:0];
+ [dataRequest respondWithData:decodedData];
+ }
+ [loadingRequest finishLoading];
+ } else {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorNoDataFromLicenseRequest
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining DRM license.",
+ NSLocalizedFailureReasonErrorKey: @"No data received from the license server.",
+ NSLocalizedRecoverySuggestionErrorKey: @"Is the licenseServer ok?."
+ }
+ ];
+ [self finishLoadingWithError:licenseError];
+ self->_requestingCertificateErrored = YES;
+ }
+
+ }
+ }];
+ [postDataTask resume];
+ }
+
+ } else {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorNoSPC
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining license.",
+ NSLocalizedFailureReasonErrorKey: @"No spc received.",
+ NSLocalizedRecoverySuggestionErrorKey: @"Check your DRM config."
+ }
+ ];
+ [self finishLoadingWithError:licenseError];
+ self->_requestingCertificateErrored = YES;
+ }
+
+ } else {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorNoDataRequest
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining DRM license.",
+ NSLocalizedFailureReasonErrorKey: @"No dataRequest found.",
+ NSLocalizedRecoverySuggestionErrorKey: @"Check your DRM configuration."
+ }
+ ];
+ [self finishLoadingWithError:licenseError];
+ self->_requestingCertificateErrored = YES;
+ }
+ } else {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorNoCertificateData
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining DRM license.",
+ NSLocalizedFailureReasonErrorKey: @"No certificate data obtained from the specificied url.",
+ NSLocalizedRecoverySuggestionErrorKey: @"Have you specified a valid 'certificateUrl'?"
+ }
+ ];
+ [self finishLoadingWithError:licenseError];
+ self->_requestingCertificateErrored = YES;
+ }
+ });
+ return YES;
+ } else {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorNoCertificateURL
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining DRM License.",
+ NSLocalizedFailureReasonErrorKey: @"No certificate URL has been found.",
+ NSLocalizedRecoverySuggestionErrorKey: @"Did you specified the prop certificateUrl?"
+ }
+ ];
+ return [self finishLoadingWithError:licenseError];
+ }
+ } else {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorNoFairplayDRM
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining DRM license.",
+ NSLocalizedFailureReasonErrorKey: @"Not a valid DRM Scheme has found",
+ NSLocalizedRecoverySuggestionErrorKey: @"Have you specified the 'drm' 'type' as fairplay?"
+ }
+ ];
+ return [self finishLoadingWithError:licenseError];
+ }
+
+ } else {
+ NSError *licenseError = [NSError errorWithDomain: @"RCTVideo"
+ code: RCTVideoErrorNoDRMData
+ userInfo: @{
+ NSLocalizedDescriptionKey: @"Error obtaining DRM license.",
+ NSLocalizedFailureReasonErrorKey: @"No drm object found.",
+ NSLocalizedRecoverySuggestionErrorKey: @"Have you specified the 'drm' prop?"
+ }
+ ];
+ return [self finishLoadingWithError:licenseError];
+ }
+
+
+ return NO;
+}
+
+- (NSData *)base64DataFromBase64String: (NSString *)base64String {
+ if (base64String != nil) {
+ // NSData from the Base64 encoded str
+ NSData *base64Data = [[NSData alloc] initWithBase64EncodedString:base64String options:NSASCIIStringEncoding];
+ return base64Data;
+ }
+ return nil;
+}
#pragma mark - Picture in Picture
#if TARGET_OS_IOS
- (void)pictureInPictureControllerDidStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
if (self.onPictureInPictureStatusChanged) {
self.onPictureInPictureStatusChanged(@{
- @"isActive": [NSNumber numberWithBool:false]
- });
+ @"isActive": [NSNumber numberWithBool:false]
+ });
}
}
- (void)pictureInPictureControllerDidStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
if (self.onPictureInPictureStatusChanged) {
self.onPictureInPictureStatusChanged(@{
- @"isActive": [NSNumber numberWithBool:true]
- });
+ @"isActive": [NSNumber numberWithBool:true]
+ });
}
}
- (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
-
+
}
- (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
-
+
}
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController failedToStartPictureInPictureWithError:(NSError *)error {
-
+
}
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL))completionHandler {
diff --git a/ios/Video/RCTVideoManager.m b/ios/Video/RCTVideoManager.m
index 62c8b821..000a9e83 100644
--- a/ios/Video/RCTVideoManager.m
+++ b/ios/Video/RCTVideoManager.m
@@ -19,6 +19,7 @@ RCT_EXPORT_MODULE();
}
RCT_EXPORT_VIEW_PROPERTY(src, NSDictionary);
+RCT_EXPORT_VIEW_PROPERTY(drm, NSDictionary);
RCT_EXPORT_VIEW_PROPERTY(maxBitRate, float);
RCT_EXPORT_VIEW_PROPERTY(resizeMode, NSString);
RCT_EXPORT_VIEW_PROPERTY(repeat, BOOL);
@@ -68,6 +69,7 @@ RCT_EXPORT_VIEW_PROPERTY(onPlaybackStalled, RCTDirectEventBlock);
RCT_EXPORT_VIEW_PROPERTY(onPlaybackResume, RCTDirectEventBlock);
RCT_EXPORT_VIEW_PROPERTY(onPlaybackRateChange, RCTDirectEventBlock);
RCT_EXPORT_VIEW_PROPERTY(onVideoExternalPlaybackChange, RCTDirectEventBlock);
+RCT_EXPORT_VIEW_PROPERTY(onGetLicense, RCTDirectEventBlock);
RCT_REMAP_METHOD(save,
options:(NSDictionary *)options
reactTag:(nonnull NSNumber *)reactTag
@@ -82,7 +84,34 @@ RCT_REMAP_METHOD(save,
[view save:options resolve:resolve reject:reject];
}
}];
-}
+};
+RCT_REMAP_METHOD(setLicenseResult,
+ license:(NSString *)license
+ reactTag:(nonnull NSNumber *)reactTag)
+{
+ [self.bridge.uiManager prependUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) {
+ RCTVideo *view = viewRegistry[reactTag];
+ if (![view isKindOfClass:[RCTVideo class]]) {
+ RCTLogError(@"Invalid view returned from registry, expecting RCTVideo, got: %@", view);
+ } else {
+ [view setLicenseResult:license];
+ }
+ }];
+};
+
+RCT_REMAP_METHOD(setLicenseResultError,
+ error:(NSString *)error
+ reactTag:(nonnull NSNumber *)reactTag)
+{
+ [self.bridge.uiManager prependUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) {
+ RCTVideo *view = viewRegistry[reactTag];
+ if (![view isKindOfClass:[RCTVideo class]]) {
+ RCTLogError(@"Invalid view returned from registry, expecting RCTVideo, got: %@", view);
+ } else {
+ [view setLicenseResultError:error];
+ }
+ }];
+};
RCT_EXPORT_VIEW_PROPERTY(onPictureInPictureStatusChanged, RCTDirectEventBlock);
RCT_EXPORT_VIEW_PROPERTY(onRestoreUserInterfaceForPictureInPictureStop, RCTDirectEventBlock);
diff --git a/package.json b/package.json
index 1ae4fb25..136e59eb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "react-native-video",
- "version": "5.1.0-alpha5",
+ "version": "5.1.1",
"description": "A element for react-native",
"main": "Video.js",
"license": "MIT",
@@ -34,7 +34,8 @@
"react": "^16.12.0",
"react-dom": "^16.12.0",
"react-hot-loader": "^4.12.19",
- "react-native": "^0.61.5"
+ "react-native": "^0.61.5",
+ "react-native-windows": "^0.61.0-0"
},
"dependencies": {
"keymirror": "^0.1.1",
@@ -51,6 +52,7 @@
"ios",
"windows",
"FilterType.js",
+ "DRMType.js",
"TextTrackType.js",
"VideoResizeMode.js",
"react-native-video.podspec"
diff --git a/react-native-video.podspec b/react-native-video.podspec
index 98ba5537..7013f957 100644
--- a/react-native-video.podspec
+++ b/react-native-video.podspec
@@ -29,7 +29,11 @@ Pod::Spec.new do |s|
s.static_framework = true
end
- s.dependency "React"
+ s.dependency "React-Core"
s.default_subspec = "Video"
+
+ s.xcconfig = {
+ 'OTHER_LDFLAGS': '-ObjC',
+ }
end
diff --git a/windows/.clang-format b/windows/.clang-format
new file mode 100644
index 00000000..efab43b5
--- /dev/null
+++ b/windows/.clang-format
@@ -0,0 +1,92 @@
+---
+AccessModifierOffset: -1
+AlignAfterOpenBracket: AlwaysBreak
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlinesLeft: true
+AlignOperands: false
+AlignTrailingComments: false
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: Empty
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: true
+AlwaysBreakTemplateDeclarations: true
+BinPackArguments: false
+BinPackParameters: false
+BraceWrapping:
+ AfterClass: false
+ AfterControlStatement: false
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ AfterObjCDeclaration: false
+ AfterStruct: false
+ AfterUnion: false
+ BeforeCatch: false
+ BeforeElse: false
+ IndentBraces: false
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Attach
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: false
+ColumnLimit: 120
+CommentPragmas: '^ IWYU pragma:'
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+DisableFormat: false
+ForEachMacros: [ FOR_EACH_RANGE, FOR_EACH, ]
+IncludeBlocks: Preserve
+IncludeCategories:
+ - Regex: 'pch.h'
+ Priority: -1
+ - Regex: '.*\.g\..*'
+ Priority: 1
+ - Regex: '^<.*\.h(pp)?>'
+ Priority: 2
+ - Regex: '^<.*'
+ Priority: 3
+ - Regex: '.*'
+ Priority: 4
+IndentCaseLabels: true
+IndentWidth: 2
+IndentWrappedFunctionNames: false
+KeepEmptyLinesAtTheStartOfBlocks: false
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: true
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakBeforeFirstCallParameter: 1
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 200
+PointerAlignment: Right
+ReflowComments: true
+SortIncludes: true
+SpaceAfterCStyleCast: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard: Cpp11
+TabWidth: 8
+UseTab: Never
+...
diff --git a/windows/.gitignore b/windows/.gitignore
index 74236826..878f7ba5 100644
--- a/windows/.gitignore
+++ b/windows/.gitignore
@@ -1,97 +1,92 @@
-#Visual Studio files
-*.[Oo]bj
-*.user
-*.aps
-*.pch
-*.vspscc
-*.vssscc
-*_i.c
-*_p.c
-*.ncb
-*.suo
-*.tlb
-*.tlh
-*.tlog
-*.bak
-*.[Cc]ache
-*.ilk
-*.log
-*.lib
-*.sbr
-*.sdf
-*.opensdf
-*.opendb
-*.unsuccessfulbuild
-*.lastbuildstate
-ipch/
-[Oo]bj/
-[Bb]in
-[Dd]ebug*/
-[Rr]elease*/
-*.tlog/
-Ankh.NoLoad
-UpgradeLog.htm
-
-#MonoDevelop
-*.pidb
-*.userprefs
-
-#Tooling
-_ReSharper*/
-*.resharper
-[Tt]est[Rr]esult*
-*.sass-cache
-
-#Project files
-[Bb]uild/
-
-#Subversion files
-.svn
-
-# Office Temp Files
-~$*
-
-# vim Temp Files
-*~
-
-#NuGet
-packages/
-*.nupkg
-
-#ncrunch
-*ncrunch*
-*crunch*.local.xml
-
-# visual studio database projects
-*.dbmdl
-
-#Test files
-*.testsettings
-
-#Other files
-*.DotSettings
-.vs/
-.vscode/
-*project.lock.json
-
-#JavaScript files
-*.jsbundle
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Build results
-[Dd]ebugPublic/
-[Rr]eleases/
-x64/
-x86/
-bld/
-[Ll]og/
+*AppPackages*
+*BundleArtifacts*
+
+#OS junk files
+[Tt]humbs.db
+*.DS_Store
+
+#Visual Studio files
+*.[Oo]bj
+*.user
+*.aps
+*.pch
+*.vspscc
+*.vssscc
+*_i.c
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.[Cc]ache
+*.ilk
+*.log
+*.lib
+*.sbr
+*.sdf
+*.opensdf
+*.opendb
+*.unsuccessfulbuild
+ipch/
+[Oo]bj/
+[Bb]in
+[Dd]ebug*/
+[Rr]elease*/
+Ankh.NoLoad
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+#MonoDevelop
+*.pidb
+*.userprefs
+
+#Tooling
+_ReSharper*/
+*.resharper
+[Tt]est[Rr]esult*
+*.sass-cache
+
+#Project files
+[Bb]uild/
+
+#Subversion files
+.svn
+
+# Office Temp Files
+~$*
+
+# vim Temp Files
+*~
+
+#NuGet
+packages/
+*.nupkg
+
+#ncrunch
+*ncrunch*
+*crunch*.local.xml
+
+# visual studio database projects
+*.dbmdl
+
+#Test files
+*.testsettings
+
+#Other files
+*.DotSettings
+.vs/
+*project.lock.json
+
+#Files generated by the VS build
+**/Generated Files/**
+
diff --git a/windows/.npmignore b/windows/.npmignore
new file mode 100644
index 00000000..e6def506
--- /dev/null
+++ b/windows/.npmignore
@@ -0,0 +1,9 @@
+
+# Make sure we don't publish build artifacts to NPM
+ARM/
+Debug/
+x64/
+x86/
+bin/
+obj/
+.vs/
diff --git a/windows/README.md b/windows/README.md
new file mode 100644
index 00000000..b8b03e94
--- /dev/null
+++ b/windows/README.md
@@ -0,0 +1,37 @@
+# React Native Video (Windows)
+
+React Native Video is currently maintained for React Native Windows (RNW) >= 0.61.
+
+There is one implementation of `react-native-video` in this folder:
+
+1. _ReactNativeVideoCPP_ is the currently maintained implementation:
+ 1. Use _ReactNativeVideoCPP_ for RNW >= 0.62.
+ 2. Use _ReactNativeVideoCPP61_ for RNW 0.61.
+
+# Local Development Setup (RNW >= 0.61)
+
+In order to work on _ReactNativeVideoCPP_, you'll need to install the [Windows Development Dependencies](https://microsoft.github.io/react-native-windows/docs/rnw-dependencies).
+
+In addition, `react-native-video` targets React Native 0.61 and React Native Windows 0.61 as dev dependencies. So in order to build _ReactNativeVideoCPP_ locally against RNW > 0.61 you'll need to temporarily upgrade the development dependencies:
+
+## RNW >= 0.63
+
+```
+npm install react-native@^0.63 --only=dev
+npm install react-native-windows@^0.63 --only=dev
+```
+
+Now you should be able to open `ReactNativeVideoCPP.sln` in Visual Studio and build the project.
+
+## RNW 0.62
+
+```
+npm install react-native@^0.62 --only=dev
+npm install react-native-windows@^0.62 --only=dev
+```
+
+Now you should be able to open `ReactNativeVideoCPP62.sln` in Visual Studio and build the project.
+
+## RNW 0.61
+
+You should be able to open `ReactNativeVideoCPP61.sln` in Visual Studio and build the project.
diff --git a/windows/ReactNativeVideoCPP.sln b/windows/ReactNativeVideoCPP.sln
new file mode 100644
index 00000000..3c3f4dbc
--- /dev/null
+++ b/windows/ReactNativeVideoCPP.sln
@@ -0,0 +1,226 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30114.105
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeVideoCPP", "ReactNativeVideoCPP\ReactNativeVideoCPP.vcxproj", "{0D1E54D3-4BE1-4DAF-98BF-124C28C85014}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReactNative", "ReactNative", "{4F6E56C3-12C5-4457-9239-0ACF0B7150A8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\node_modules\react-native-windows\Common\Common.vcxproj", "{FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Folly", "..\node_modules\react-native-windows\Folly\Folly.vcxproj", "{A990658C-CE31-4BCC-976F-0FC6B1AF693D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Universal", "..\node_modules\react-native-windows\JSI\Universal\JSI.Universal.vcxproj", "{A62D504A-16B8-41D2-9F19-E2E86019E5E4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Shared", "..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems", "{0CC28589-39E4-4288-B162-97B959F8B843}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra", "..\node_modules\react-native-windows\Chakra\Chakra.vcxitems", "{C38970C0-5FBF-4D69-90D8-CBAC225AE895}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative", "..\node_modules\react-native-windows\Microsoft.ReactNative\Microsoft.ReactNative.vcxproj", "{F7D32BD0-2749-483E-9A0D-1635EF7E3136}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\react-native-windows\Mso\Mso.vcxitems", "{84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactCommon", "..\node_modules\react-native-windows\ReactCommon\ReactCommon.vcxproj", "{A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Cxx", "..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems", "{DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Shared", "..\node_modules\react-native-windows\Shared\Shared.vcxitems", "{2049DBE9-8D13-42C9-AE4B-413AE38FFFD0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Include", "..\node_modules\react-native-windows\include\Include.vcxitems", "{EF074BA1-2D54-4D49-A28E-5E040B47CD2E}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{0cc28589-39e4-4288-b162-97b959f8b843}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{2049dbe9-8d13-42c9-ae4b-413ae38fffd0}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{84e05bfa-cbaf-4f0d-bfb6-4ce85742a57e}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{a62d504a-16b8-41d2-9f19-e2e86019e5e4}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{c38970c0-5fbf-4d69-90d8-cbac225ae895}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{da8b35b3-da00-4b02-bde6-6a397b3fd46b}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\include\Include.vcxitems*{ef074ba1-2d54-4d49-a28e-5e040b47cd2e}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ WinUI3|ARM = WinUI3|ARM
+ WinUI3|ARM64 = WinUI3|ARM64
+ WinUI3|x64 = WinUI3|x64
+ WinUI3|x86 = WinUI3|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM.ActiveCfg = Debug|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM.Build.0 = Debug|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM64.Build.0 = Debug|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x64.ActiveCfg = Debug|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x64.Build.0 = Debug|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x86.ActiveCfg = Debug|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x86.Build.0 = Debug|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM.ActiveCfg = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM.Build.0 = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM64.ActiveCfg = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM64.Build.0 = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x64.ActiveCfg = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x64.Build.0 = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x86.ActiveCfg = Release|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x86.Build.0 = Release|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM.Build.0 = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x64.ActiveCfg = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x64.Build.0 = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x86.ActiveCfg = Release|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x86.Build.0 = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.Build.0 = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.ActiveCfg = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.Build.0 = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.ActiveCfg = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.Build.0 = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.ActiveCfg = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.Build.0 = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.Build.0 = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.ActiveCfg = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM.Build.0 = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x64.ActiveCfg = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x64.Build.0 = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x86.ActiveCfg = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x86.Build.0 = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.ActiveCfg = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.Build.0 = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.ActiveCfg = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.Build.0 = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.ActiveCfg = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.Build.0 = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.Build.0 = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.ActiveCfg = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.Build.0 = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.ActiveCfg = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.Build.0 = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM.Build.0 = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x64.ActiveCfg = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x64.Build.0 = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x86.ActiveCfg = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x86.Build.0 = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.Build.0 = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.ActiveCfg = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.Build.0 = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.ActiveCfg = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.Build.0 = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.ActiveCfg = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.Build.0 = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.Build.0 = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.ActiveCfg = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.Build.0 = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.ActiveCfg = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.Build.0 = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM.Build.0 = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x64.ActiveCfg = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x64.Build.0 = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x86.ActiveCfg = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x86.Build.0 = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.ActiveCfg = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.Build.0 = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.Build.0 = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.ActiveCfg = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.Build.0 = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.ActiveCfg = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.Build.0 = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.ActiveCfg = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.Build.0 = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.ActiveCfg = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.Build.0 = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.ActiveCfg = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.Build.0 = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.ActiveCfg = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.Build.0 = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM.Build.0 = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x64.ActiveCfg = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x64.Build.0 = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x86.ActiveCfg = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x86.Build.0 = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.Build.0 = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.ActiveCfg = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.Build.0 = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.ActiveCfg = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.Build.0 = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.ActiveCfg = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.Build.0 = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.Build.0 = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.ActiveCfg = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.Build.0 = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.ActiveCfg = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.Build.0 = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM.Build.0 = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x64.ActiveCfg = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x64.Build.0 = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x86.ActiveCfg = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {0CC28589-39E4-4288-B162-97B959F8B843} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {C38970C0-5FBF-4D69-90D8-CBAC225AE895} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {2049DBE9-8D13-42C9-AE4B-413AE38FFFD0} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {EF074BA1-2D54-4D49-A28E-5E040B47CD2E} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {BA6749D3-A890-4136-BFD8-0D660E903803}
+ EndGlobalSection
+EndGlobal
diff --git a/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj b/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj
index ae12f7a7..83bddbf0 100644
--- a/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj
+++ b/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj
@@ -1,27 +1,34 @@
-
-
+
+
true
true
true
- {765365e4-9553-4900-9f69-e26d4309c8da}
+ {0d1e54d3-4be1-4daf-98bf-124c28c85014}
ReactNativeVideoCPP
ReactNativeVideoCPP
en-US
- 14.0
+ 16.0
true
Windows Store
10.0
10.0.18362.0
- 10.0.15063.0
+ 10.0.16299.0
+
+ $([MSBuild]::GetDirectoryNameOfFileAbove($(SolutionDir), 'node_modules\react-native-windows\package.json'))\node_modules\react-native-windows\
+
Debug
ARM
+
+ Debug
+ ARM64
+
Debug
Win32
@@ -34,6 +41,10 @@
Release
ARM
+
+ Release
+ ARM64
+
Release
Win32
@@ -45,9 +56,6 @@
DynamicLibrary
- v140
- v141
- v142
Unicode
false
@@ -63,15 +71,15 @@
-
-
-
+
+
+
@@ -96,6 +104,7 @@
_DEBUG;%(PreprocessorDefinitions)
+ ProgramDatabase
@@ -137,21 +146,26 @@
-
-
- {f7d32bd0-2749-483e-9a0d-1635ef7e3136}
- false
-
-
+
+
+
+
+
+ This project references targets in your node_modules\react-native-windows folder. The missing file is {0}.
+
+
+
+
-
+
This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
+
+
-
\ No newline at end of file
+
+
diff --git a/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj.filters b/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj.filters
index de60c2b0..776e33d1 100644
--- a/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj.filters
+++ b/windows/ReactNativeVideoCPP/ReactNativeVideoCPP.vcxproj.filters
@@ -29,9 +29,6 @@
-
-
-
diff --git a/windows/ReactNativeVideoCPP/ReactPackageProvider.idl b/windows/ReactNativeVideoCPP/ReactPackageProvider.idl
index 79a74ceb..ebb128cc 100644
--- a/windows/ReactNativeVideoCPP/ReactPackageProvider.idl
+++ b/windows/ReactNativeVideoCPP/ReactPackageProvider.idl
@@ -1,7 +1,9 @@
-namespace ReactNativeVideoCPP {
-[webhosthidden]
-[default_interface]
-runtimeclass ReactPackageProvider : Microsoft.ReactNative.IReactPackageProvider {
- ReactPackageProvider();
-};
-} // namespace ReactNativeVideoCPP
+namespace ReactNativeVideoCPP
+{
+ [webhosthidden]
+ [default_interface]
+ runtimeclass ReactPackageProvider : Microsoft.ReactNative.IReactPackageProvider
+ {
+ ReactPackageProvider();
+ };
+}
diff --git a/windows/ReactNativeVideoCPP/ReactVideoView.cpp b/windows/ReactNativeVideoCPP/ReactVideoView.cpp
index b9a1aa53..4f49c222 100644
--- a/windows/ReactNativeVideoCPP/ReactVideoView.cpp
+++ b/windows/ReactNativeVideoCPP/ReactVideoView.cpp
@@ -16,229 +16,233 @@ using namespace Windows::Media::Playback;
namespace winrt::ReactNativeVideoCPP::implementation {
-ReactVideoView::ReactVideoView(winrt::Microsoft::ReactNative::IReactContext const& reactContext)
- : m_reactContext(reactContext){
- // always create and set the player here instead of depending on auto-create logic
- // in the MediaPlayerElement (only when auto play is on or URI is set)
- m_player = winrt::Windows::Media::Playback::MediaPlayer();
- SetMediaPlayer(m_player);
- m_uiDispatcher = CoreWindow::GetForCurrentThread().Dispatcher();
+ReactVideoView::ReactVideoView(winrt::Microsoft::ReactNative::IReactContext const &reactContext)
+ : m_reactContext(reactContext) {
+ // always create and set the player here instead of depending on auto-create logic
+ // in the MediaPlayerElement (only when auto play is on or URI is set)
+ m_player = winrt::Windows::Media::Playback::MediaPlayer();
+ SetMediaPlayer(m_player);
+ m_uiDispatcher = CoreWindow::GetForCurrentThread().Dispatcher();
- m_mediaOpenedToken = m_player.MediaOpened(winrt::auto_revoke, [ref = get_weak()](auto const& sender, auto const& args) {
+ m_mediaOpenedToken =
+ m_player.MediaOpened(winrt::auto_revoke, [ref = get_weak()](auto const &sender, auto const &args) {
if (auto self = ref.get()) {
- self->OnMediaOpened(sender, args);
+ self->OnMediaOpened(sender, args);
}
- });
- m_mediaFailedToken = m_player.MediaFailed(winrt::auto_revoke, [ref = get_weak()](auto const& sender, auto const& args) {
+ });
+ m_mediaFailedToken =
+ m_player.MediaFailed(winrt::auto_revoke, [ref = get_weak()](auto const &sender, auto const &args) {
if (auto self = ref.get()) {
- self->OnMediaFailed(sender, args);
+ self->OnMediaFailed(sender, args);
}
- });
+ });
- m_mediaEndedToken = m_player.MediaEnded(winrt::auto_revoke, [ref = get_weak()](auto const& sender, auto const& args) {
- if (auto self = ref.get()) {
- self->OnMediaEnded(sender, args);
- }
- });
+ m_mediaEndedToken = m_player.MediaEnded(winrt::auto_revoke, [ref = get_weak()](auto const &sender, auto const &args) {
+ if (auto self = ref.get()) {
+ self->OnMediaEnded(sender, args);
+ }
+ });
- m_bufferingStartedToken =
- m_player.PlaybackSession().BufferingStarted(winrt::auto_revoke, [ref = get_weak()](auto const& sender, auto const& args) {
+ m_bufferingStartedToken = m_player.PlaybackSession().BufferingStarted(
+ winrt::auto_revoke, [ref = get_weak()](auto const &sender, auto const &args) {
if (auto self = ref.get()) {
- self->OnBufferingStarted(sender, args);
+ self->OnBufferingStarted(sender, args);
}
- });
+ });
- m_bufferingEndedToken =
- m_player.PlaybackSession().BufferingEnded(winrt::auto_revoke, [ref = get_weak()](auto const& sender, auto const& args) {
+ m_bufferingEndedToken = m_player.PlaybackSession().BufferingEnded(
+ winrt::auto_revoke, [ref = get_weak()](auto const &sender, auto const &args) {
if (auto self = ref.get()) {
- self->OnBufferingEnded(sender, args);
+ self->OnBufferingEnded(sender, args);
}
- });
+ });
- m_seekCompletedToken =
- m_player.PlaybackSession().SeekCompleted(winrt::auto_revoke, [ref = get_weak()](auto const& sender, auto const& args) {
+ m_seekCompletedToken = m_player.PlaybackSession().SeekCompleted(
+ winrt::auto_revoke, [ref = get_weak()](auto const &sender, auto const &args) {
if (auto self = ref.get()) {
- self->OnSeekCompleted(sender, args);
+ self->OnSeekCompleted(sender, args);
}
- });
+ });
- m_timer = Windows::UI::Xaml::DispatcherTimer();
- m_timer.Interval(std::chrono::milliseconds{ 250 });
- m_timer.Start();
- auto token = m_timer.Tick([ref = get_weak()](auto const&, auto const&) {
- if (auto self = ref.get()){
- if (auto mediaPlayer = self->m_player) {
- if (mediaPlayer.PlaybackSession().PlaybackState() ==
- winrt::Windows::Media::Playback::MediaPlaybackState::Playing) {
- auto currentTimeInSeconds = mediaPlayer.PlaybackSession().Position().count() / 10000000;
- self->m_reactContext.DispatchEvent(
- *self,
- L"topProgress",
- [&](winrt::Microsoft::ReactNative::IJSValueWriter const& eventDataWriter) noexcept {
- eventDataWriter.WriteObjectBegin();
- {
- WriteProperty(eventDataWriter, L"currentTime", currentTimeInSeconds);
- WriteProperty(eventDataWriter, L"playableDuration", 0.0);
- }
- eventDataWriter.WriteObjectEnd();
- });
+ m_timer = Windows::UI::Xaml::DispatcherTimer();
+ m_timer.Interval(std::chrono::milliseconds{250});
+ m_timer.Start();
+ auto token = m_timer.Tick([ref = get_weak()](auto const &, auto const &) {
+ if (auto self = ref.get()) {
+ if (auto mediaPlayer = self->m_player) {
+ if (mediaPlayer.PlaybackSession().PlaybackState() ==
+ winrt::Windows::Media::Playback::MediaPlaybackState::Playing) {
+ auto currentTimeInSeconds = mediaPlayer.PlaybackSession().Position().count() / 10000000;
+ self->m_reactContext.DispatchEvent(
+ *self,
+ L"topProgress",
+ [&](winrt::Microsoft::ReactNative::IJSValueWriter const &eventDataWriter) noexcept {
+ eventDataWriter.WriteObjectBegin();
+ {
+ WriteProperty(eventDataWriter, L"currentTime", currentTimeInSeconds);
+ WriteProperty(eventDataWriter, L"playableDuration", 0.0);
}
- }
+ eventDataWriter.WriteObjectEnd();
+ });
}
- });
+ }
+ }
+ });
}
-void ReactVideoView::OnMediaOpened(IInspectable const&, IInspectable const&) {
- runOnQueue([weak_this{ get_weak() }]() {
- if (auto strong_this{ weak_this.get() }) {
- if (auto mediaPlayer = strong_this->m_player) {
- auto width = mediaPlayer.PlaybackSession().NaturalVideoWidth();
- auto height = mediaPlayer.PlaybackSession().NaturalVideoHeight();
- auto orientation = (width > height) ? L"landscape" : L"portrait";
- auto durationInSeconds = mediaPlayer.PlaybackSession().NaturalDuration().count() / 10000000;
- auto currentTimeInSeconds = mediaPlayer.PlaybackSession().Position().count() / 10000000;
+void ReactVideoView::OnMediaOpened(IInspectable const &, IInspectable const &) {
+ runOnQueue([weak_this{get_weak()}]() {
+ if (auto strong_this{weak_this.get()}) {
+ if (auto mediaPlayer = strong_this->m_player) {
+ auto width = mediaPlayer.PlaybackSession().NaturalVideoWidth();
+ auto height = mediaPlayer.PlaybackSession().NaturalVideoHeight();
+ auto orientation = (width > height) ? L"landscape" : L"portrait";
+ auto durationInSeconds = mediaPlayer.PlaybackSession().NaturalDuration().count() / 10000000;
+ auto currentTimeInSeconds = mediaPlayer.PlaybackSession().Position().count() / 10000000;
- strong_this->m_reactContext.DispatchEvent(
- *strong_this,
- L"topLoad",
- [&](winrt::Microsoft::ReactNative::IJSValueWriter const& eventDataWriter) noexcept {
- eventDataWriter.WriteObjectBegin();
- {
- WriteProperty(eventDataWriter, L"duration", durationInSeconds);
- WriteProperty(eventDataWriter, L"currentTime", currentTimeInSeconds);
+ strong_this->m_reactContext.DispatchEvent(
+ *strong_this,
+ L"topLoad",
+ [&](winrt::Microsoft::ReactNative::IJSValueWriter const &eventDataWriter) noexcept {
+ eventDataWriter.WriteObjectBegin();
+ {
+ WriteProperty(eventDataWriter, L"duration", durationInSeconds);
+ WriteProperty(eventDataWriter, L"currentTime", currentTimeInSeconds);
- eventDataWriter.WritePropertyName(L"naturalSize");
- {
- eventDataWriter.WriteObjectBegin();
- WriteProperty(eventDataWriter, L"width", width);
- WriteProperty(eventDataWriter, L"height", height);
- WriteProperty(eventDataWriter, L"orientation", orientation);
- WriteProperty(eventDataWriter, L"orientation", orientation);
- eventDataWriter.WriteObjectEnd();
- }
+ eventDataWriter.WritePropertyName(L"naturalSize");
+ {
+ eventDataWriter.WriteObjectBegin();
+ WriteProperty(eventDataWriter, L"width", width);
+ WriteProperty(eventDataWriter, L"height", height);
+ WriteProperty(eventDataWriter, L"orientation", orientation);
+ WriteProperty(eventDataWriter, L"orientation", orientation);
+ eventDataWriter.WriteObjectEnd();
+ }
- WriteProperty(eventDataWriter, L"canPlayFastForward", false);
- WriteProperty(eventDataWriter, L"canPlaySlowForward", false);
- WriteProperty(eventDataWriter, L"canPlaySlow", false);
- WriteProperty(eventDataWriter, L"canStepBackward", false);
- WriteProperty(eventDataWriter, L"canStepForward", false);
- }
- eventDataWriter.WriteObjectEnd();
- });
- }
- }
- });
+ WriteProperty(eventDataWriter, L"canPlayFastForward", false);
+ WriteProperty(eventDataWriter, L"canPlaySlowForward", false);
+ WriteProperty(eventDataWriter, L"canPlaySlow", false);
+ WriteProperty(eventDataWriter, L"canStepBackward", false);
+ WriteProperty(eventDataWriter, L"canStepForward", false);
+ }
+ eventDataWriter.WriteObjectEnd();
+ });
+ }
+ }
+ });
}
-void ReactVideoView::OnMediaFailed(IInspectable const&, IInspectable const&) {}
+void ReactVideoView::OnMediaFailed(IInspectable const &, IInspectable const &) {}
-void ReactVideoView::OnMediaEnded(IInspectable const&, IInspectable const&) {
- runOnQueue([weak_this{ get_weak() }]() {
- if (auto strong_this{ weak_this.get() }) {
- strong_this->m_reactContext.DispatchEvent(*strong_this, L"topEnd", nullptr);
- }
- });
+void ReactVideoView::OnMediaEnded(IInspectable const &, IInspectable const &) {
+ runOnQueue([weak_this{get_weak()}]() {
+ if (auto strong_this{weak_this.get()}) {
+ strong_this->m_reactContext.DispatchEvent(*strong_this, L"topEnd", nullptr);
+ }
+ });
}
-void ReactVideoView::OnBufferingStarted(IInspectable const&, IInspectable const&) {}
+void ReactVideoView::OnBufferingStarted(IInspectable const &, IInspectable const &) {}
-void ReactVideoView::OnBufferingEnded(IInspectable const&, IInspectable const&) {}
+void ReactVideoView::OnBufferingEnded(IInspectable const &, IInspectable const &) {}
-void ReactVideoView::OnSeekCompleted(IInspectable const&, IInspectable const&) {
- runOnQueue([weak_this{ get_weak() }]() {
- if (auto strong_this{ weak_this.get() }) {
- strong_this->m_reactContext.DispatchEvent(*strong_this, L"topSeek", nullptr);
- }
- });
+void ReactVideoView::OnSeekCompleted(IInspectable const &, IInspectable const &) {
+ runOnQueue([weak_this{get_weak()}]() {
+ if (auto strong_this{weak_this.get()}) {
+ strong_this->m_reactContext.DispatchEvent(*strong_this, L"topSeek", nullptr);
+ }
+ });
}
void ReactVideoView::Set_ProgressUpdateInterval(int64_t interval) {
- m_timer.Interval(std::chrono::milliseconds{ interval });
+ m_timer.Interval(std::chrono::milliseconds{interval});
}
void ReactVideoView::Set_IsLoopingEnabled(bool value) {
- m_isLoopingEnabled = value;
- if (m_player != nullptr) {
- m_player.IsLoopingEnabled(m_isLoopingEnabled);
- }
+ m_isLoopingEnabled = value;
+ if (m_player != nullptr) {
+ m_player.IsLoopingEnabled(m_isLoopingEnabled);
+ }
}
-void ReactVideoView::Set_UriString(hstring const& value) {
- m_uriString = value;
- if (m_player != nullptr) {
- auto uri = Uri(m_uriString);
- m_player.Source(MediaSource::CreateFromUri(uri));
- }
+void ReactVideoView::Set_UriString(hstring const &value) {
+ m_uriString = value;
+ if (m_player != nullptr) {
+ auto uri = Uri(m_uriString);
+ m_player.Source(MediaSource::CreateFromUri(uri));
+ }
}
void ReactVideoView::Set_Paused(bool value) {
- m_isPaused = value;
- if (m_player != nullptr) {
- if (m_isPaused) {
- if (IsPlaying(m_player.PlaybackSession().PlaybackState())) {
- m_player.Pause();
- }
- }
- else {
- if (!IsPlaying(m_player.PlaybackSession().PlaybackState())) {
- m_player.Play();
- }
- }
+ m_isPaused = value;
+ if (m_player != nullptr) {
+ if (m_isPaused) {
+ if (IsPlaying(m_player.PlaybackSession().PlaybackState())) {
+ m_player.Pause();
+ }
+ } else {
+ if (!IsPlaying(m_player.PlaybackSession().PlaybackState())) {
+ m_player.Play();
+ }
}
+ }
}
void ReactVideoView::Set_AutoPlay(bool autoPlay) {
- m_player.AutoPlay(autoPlay);
+ m_player.AutoPlay(autoPlay);
}
void ReactVideoView::Set_Muted(bool isMuted) {
- m_isMuted = isMuted;
- if (m_player != nullptr) {
- m_player.IsMuted(m_isMuted);
- }
+ m_isMuted = isMuted;
+ if (m_player != nullptr) {
+ m_player.IsMuted(m_isMuted);
+ }
}
void ReactVideoView::Set_Controls(bool useControls) {
- m_useControls = useControls;
- AreTransportControlsEnabled(m_useControls);
+ m_useControls = useControls;
+ AreTransportControlsEnabled(m_useControls);
}
void ReactVideoView::Set_FullScreen(bool fullScreen) {
- m_fullScreen = fullScreen;
- IsFullWindow(m_fullScreen);
+ m_fullScreen = fullScreen;
+ IsFullWindow(m_fullScreen);
- if (m_fullScreen)
- {
- Set_Controls(true); // full window will always have transport control enabled
- }
+ if (m_fullScreen) {
+ Set_Controls(true); // full window will always have transport control enabled
+ }
}
void ReactVideoView::Set_Volume(double volume) {
- m_volume = volume;
- if (m_player != nullptr) {
- m_player.Volume(m_volume);
- }
+ m_volume = volume;
+ if (m_player != nullptr) {
+ m_player.Volume(m_volume);
+ }
}
void ReactVideoView::Set_Position(double position) {
- m_position = position;
- if (m_player != nullptr) {
- std::chrono::seconds duration(static_cast(m_position));
- m_player.PlaybackSession().Position(duration);
- }
+ m_position = position;
+ if (m_player != nullptr) {
+ std::chrono::seconds duration(static_cast(m_position));
+ m_player.PlaybackSession().Position(duration);
+ }
+}
+
+void ReactVideoView::Set_PlaybackRate(double rate) {
+ if (m_player != nullptr) {
+ m_player.PlaybackSession().PlaybackRate(rate);
+ }
}
bool ReactVideoView::IsPlaying(MediaPlaybackState currentState) {
- return (
- currentState == MediaPlaybackState::Buffering ||
- currentState == MediaPlaybackState::Opening ||
- currentState == MediaPlaybackState::Playing
- );
+ return (
+ currentState == MediaPlaybackState::Buffering || currentState == MediaPlaybackState::Opening ||
+ currentState == MediaPlaybackState::Playing);
}
-void ReactVideoView::runOnQueue(std::function&& func) {
- m_uiDispatcher.RunAsync(
- winrt::Windows::UI::Core::CoreDispatcherPriority::Normal, [func = std::move(func)]() { func(); });
+void ReactVideoView::runOnQueue(std::function &&func) {
+ m_uiDispatcher.RunAsync(
+ winrt::Windows::UI::Core::CoreDispatcherPriority::Normal, [func = std::move(func)]() { func(); });
}
} // namespace winrt::ReactNativeVideoCPP::implementation
diff --git a/windows/ReactNativeVideoCPP/ReactVideoView.h b/windows/ReactNativeVideoCPP/ReactVideoView.h
index 39201e5c..d468b981 100644
--- a/windows/ReactNativeVideoCPP/ReactVideoView.h
+++ b/windows/ReactNativeVideoCPP/ReactVideoView.h
@@ -18,6 +18,7 @@ struct ReactVideoView : ReactVideoViewT {
void Set_FullScreen(bool fullScreen);
void Set_ProgressUpdateInterval(int64_t interval);
void Set_AutoPlay(bool autoPlay);
+ void Set_PlaybackRate(double rate);
private:
hstring m_uriString;
diff --git a/windows/ReactNativeVideoCPP/ReactVideoView.idl b/windows/ReactNativeVideoCPP/ReactVideoView.idl
index a1127877..49585682 100644
--- a/windows/ReactNativeVideoCPP/ReactVideoView.idl
+++ b/windows/ReactNativeVideoCPP/ReactVideoView.idl
@@ -1,16 +1,20 @@
-namespace ReactNativeVideoCPP {
-
-[default_interface] runtimeclass ReactVideoView : Windows.UI.Xaml.Controls.MediaPlayerElement {
- ReactVideoView(Microsoft.ReactNative.IReactContext context);
- void Set_UriString(String uri);
- void Set_IsLoopingEnabled(Boolean isLoopingEnabled);
- void Set_Paused(Boolean isPaused);
- void Set_Muted(Boolean isMuted);
- void Set_Volume(Double volume);
- void Set_Position(Double position);
- void Set_Controls(Boolean useControls);
- void Set_FullScreen(Boolean fullScreen);
- void Set_ProgressUpdateInterval(Int64 interval);
- void Set_AutoPlay(Boolean autoPlay);
-};
-} // namespace ReactNativeVideoCPP
+namespace ReactNativeVideoCPP
+{
+ [webhosthidden]
+ [default_interface]
+ runtimeclass ReactVideoView : Windows.UI.Xaml.Controls.MediaPlayerElement
+ {
+ ReactVideoView(Microsoft.ReactNative.IReactContext context);
+ void Set_UriString(String uri);
+ void Set_IsLoopingEnabled(Boolean isLoopingEnabled);
+ void Set_Paused(Boolean isPaused);
+ void Set_Muted(Boolean isMuted);
+ void Set_Volume(Double volume);
+ void Set_Position(Double position);
+ void Set_Controls(Boolean useControls);
+ void Set_FullScreen(Boolean fullScreen);
+ void Set_ProgressUpdateInterval(Int64 interval);
+ void Set_AutoPlay(Boolean autoPlay);
+ void Set_PlaybackRate(Double rate);
+ };
+}
diff --git a/windows/ReactNativeVideoCPP/ReactVideoViewManager.cpp b/windows/ReactNativeVideoCPP/ReactVideoViewManager.cpp
index b31a38ad..c0ad6361 100644
--- a/windows/ReactNativeVideoCPP/ReactVideoViewManager.cpp
+++ b/windows/ReactNativeVideoCPP/ReactVideoViewManager.cpp
@@ -49,6 +49,7 @@ IMapView ReactVideoViewManager::NativeProps()
nativeProps.Insert(L"controls", ViewManagerPropertyType::Boolean);
nativeProps.Insert(L"fullscreen", ViewManagerPropertyType::Boolean);
nativeProps.Insert(L"progressUpdateInterval", ViewManagerPropertyType::Number);
+ nativeProps.Insert(L"rate", ViewManagerPropertyType::Number);
return nativeProps.GetView();
}
@@ -64,28 +65,30 @@ void ReactVideoViewManager::UpdateProperties(
auto const &propertyValue = pair.second;
if (!propertyValue.IsNull()) {
if (propertyName == "src") {
- auto const &srcMap = propertyValue.Object();
- auto const &uri = srcMap.at("uri");
- reactVideoView.Set_UriString(to_hstring(uri.String()));
+ auto const &srcMap = propertyValue.AsObject();
+ auto const &uri = srcMap.at("uri");
+ reactVideoView.Set_UriString(to_hstring(uri.AsString()));
} else if (propertyName == "resizeMode") {
- reactVideoView.Stretch(static_cast(std::stoul(propertyValue.String())));
+ reactVideoView.Stretch(static_cast(std::stoul(propertyValue.AsString())));
} else if (propertyName == "repeat") {
- reactVideoView.Set_IsLoopingEnabled(propertyValue.Boolean());
+ reactVideoView.Set_IsLoopingEnabled(propertyValue.AsBoolean());
} else if (propertyName == "paused") {
- m_paused = propertyValue.Boolean();
- reactVideoView.Set_Paused(m_paused);
+ m_paused = propertyValue.AsBoolean();
+ reactVideoView.Set_Paused(m_paused);
} else if (propertyName == "muted") {
- reactVideoView.Set_Muted(propertyValue.Boolean());
+ reactVideoView.Set_Muted(propertyValue.AsBoolean());
} else if (propertyName == "volume") {
- reactVideoView.Set_Volume(propertyValue.Double());
+ reactVideoView.Set_Volume(propertyValue.AsDouble());
} else if (propertyName == "seek") {
- reactVideoView.Set_Position(propertyValue.Double());
+ reactVideoView.Set_Position(propertyValue.AsDouble());
} else if (propertyName == "controls") {
- reactVideoView.Set_Controls(propertyValue.Boolean());
+ reactVideoView.Set_Controls(propertyValue.AsBoolean());
} else if (propertyName == "fullscreen") {
- reactVideoView.Set_FullScreen(propertyValue.Boolean());
+ reactVideoView.Set_FullScreen(propertyValue.AsBoolean());
} else if (propertyName == "progressUpdateInterval") {
- reactVideoView.Set_ProgressUpdateInterval(propertyValue.Int64());
+ reactVideoView.Set_ProgressUpdateInterval(propertyValue.AsInt64());
+ } else if (propertyName == "rate") {
+ reactVideoView.Set_PlaybackRate(propertyValue.AsDouble());
}
}
}
diff --git a/windows/ReactNativeVideoCPP/packages.config b/windows/ReactNativeVideoCPP/packages.config
index 9a69657f..9dcb059f 100644
--- a/windows/ReactNativeVideoCPP/packages.config
+++ b/windows/ReactNativeVideoCPP/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/windows/ReactNativeVideoCPP/pch.h b/windows/ReactNativeVideoCPP/pch.h
index 623de244..b718381e 100644
--- a/windows/ReactNativeVideoCPP/pch.h
+++ b/windows/ReactNativeVideoCPP/pch.h
@@ -11,10 +11,10 @@
#include
#include
#include
+#include
#include
#include
#include
#include
-#include
#include
diff --git a/windows/ReactNativeVideoCPP61.sln b/windows/ReactNativeVideoCPP61.sln
new file mode 100644
index 00000000..043183d2
--- /dev/null
+++ b/windows/ReactNativeVideoCPP61.sln
@@ -0,0 +1,197 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29215.179
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Folly", "..\node_modules\react-native-windows\Folly\Folly.vcxproj", "{A990658C-CE31-4BCC-976F-0FC6B1AF693D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactCommon", "..\node_modules\react-native-windows\ReactCommon\ReactCommon.vcxproj", "{A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}"
+ ProjectSection(ProjectDependencies) = postProject
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {A990658C-CE31-4BCC-976F-0FC6B1AF693D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactWindowsCore", "..\node_modules\react-native-windows\ReactWindowsCore\ReactWindowsCore.vcxproj", "{11C084A3-A57C-4296-A679-CAC17B603144}"
+ ProjectSection(ProjectDependencies) = postProject
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {A990658C-CE31-4BCC-976F-0FC6B1AF693D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra", "..\node_modules\react-native-windows\Chakra\Chakra.vcxitems", "{C38970C0-5FBF-4D69-90D8-CBAC225AE895}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative", "..\node_modules\react-native-windows\Microsoft.ReactNative\Microsoft.ReactNative.vcxproj", "{F7D32BD0-2749-483E-9A0D-1635EF7E3136}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Shared", "..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems", "{0CC28589-39E4-4288-B162-97B959F8B843}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Universal", "..\node_modules\react-native-windows\JSI\Universal\JSI.Universal.vcxproj", "{A62D504A-16B8-41D2-9F19-E2E86019E5E4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Cxx", "..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems", "{DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.ReactNative.SharedManaged", "..\node_modules\react-native-windows\Microsoft.ReactNative.SharedManaged\Microsoft.ReactNative.SharedManaged.shproj", "{67A1076F-7790-4203-86EA-4402CCB5E782}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\node_modules\react-native-windows\Common\Common.vcxproj", "{FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReactNative", "ReactNative", "{5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shared", "..\node_modules\react-native-windows\Shared\Shared.vcxitems", "{2049DBE9-8D13-42C9-AE4B-413AE38FFFD0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\react-native-windows\Mso\Mso.vcxitems", "{84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeVideoCPP61", "ReactNativeVideoCPP61\ReactNativeVideoCPP61.vcxproj", "{765365E4-9553-4900-9F69-E26D4309C8DA}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{0cc28589-39e4-4288-b162-97b959f8b843}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{2049dbe9-8d13-42c9-ae4b-413ae38fffd0}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{765365e4-9553-4900-9f69-e26d4309c8da}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.SharedManaged\Microsoft.ReactNative.SharedManaged.projitems*{67a1076f-7790-4203-86ea-4402ccb5e782}*SharedItemsImports = 13
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{84e05bfa-cbaf-4f0d-bfb6-4ce85742a57e}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{a62d504a-16b8-41d2-9f19-e2e86019e5e4}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{c38970c0-5fbf-4d69-90d8-cbac225ae895}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{da8b35b3-da00-4b02-bde6-6a397b3fd46b}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.ActiveCfg = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.Build.0 = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.ActiveCfg = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.Build.0 = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.ActiveCfg = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.Build.0 = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.Build.0 = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.ActiveCfg = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.Build.0 = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.ActiveCfg = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.Build.0 = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.Build.0 = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.ActiveCfg = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.Build.0 = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.ActiveCfg = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.Build.0 = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.ActiveCfg = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.Build.0 = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.Build.0 = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.ActiveCfg = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.Build.0 = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.ActiveCfg = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.Build.0 = Release|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM.ActiveCfg = Debug|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM.Build.0 = Debug|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM64.Build.0 = Debug|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x64.ActiveCfg = Debug|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x64.Build.0 = Debug|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x86.ActiveCfg = Debug|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x86.Build.0 = Debug|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM.ActiveCfg = Release|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM.Build.0 = Release|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM64.ActiveCfg = Release|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM64.Build.0 = Release|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x64.ActiveCfg = Release|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x64.Build.0 = Release|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x86.ActiveCfg = Release|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x86.Build.0 = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.ActiveCfg = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.Build.0 = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.Build.0 = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.ActiveCfg = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.Build.0 = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.ActiveCfg = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.Build.0 = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.ActiveCfg = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.Build.0 = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.ActiveCfg = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.Build.0 = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.ActiveCfg = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.Build.0 = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.ActiveCfg = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.Build.0 = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.Build.0 = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.ActiveCfg = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.Build.0 = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.ActiveCfg = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.Build.0 = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.ActiveCfg = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.Build.0 = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.Build.0 = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.ActiveCfg = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.Build.0 = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.ActiveCfg = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.Build.0 = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.Build.0 = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.ActiveCfg = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.Build.0 = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.ActiveCfg = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.Build.0 = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.ActiveCfg = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.Build.0 = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.Build.0 = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.ActiveCfg = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|ARM.ActiveCfg = Debug|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|ARM.Build.0 = Debug|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|ARM64.ActiveCfg = Debug|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x64.ActiveCfg = Debug|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x64.Build.0 = Debug|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x86.ActiveCfg = Debug|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Debug|x86.Build.0 = Debug|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|ARM.ActiveCfg = Release|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|ARM.Build.0 = Release|ARM
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|ARM64.ActiveCfg = Release|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x64.ActiveCfg = Release|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x64.Build.0 = Release|x64
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x86.ActiveCfg = Release|Win32
+ {765365E4-9553-4900-9F69-E26D4309C8DA}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {11C084A3-A57C-4296-A679-CAC17B603144} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {C38970C0-5FBF-4D69-90D8-CBAC225AE895} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {0CC28589-39E4-4288-B162-97B959F8B843} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {67A1076F-7790-4203-86EA-4402CCB5E782} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {2049DBE9-8D13-42C9-AE4B-413AE38FFFD0} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ {84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {EFC28029-29B3-4E9C-91A3-3995E0E9BF6E}
+ EndGlobalSection
+EndGlobal
diff --git a/windows/ReactNativeVideoCPP61/PropertySheet.props b/windows/ReactNativeVideoCPP61/PropertySheet.props
new file mode 100644
index 00000000..3e15bb90
--- /dev/null
+++ b/windows/ReactNativeVideoCPP61/PropertySheet.props
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/windows/ReactNativeVideoCPP61/ReactNativeVideoCPP61.vcxproj b/windows/ReactNativeVideoCPP61/ReactNativeVideoCPP61.vcxproj
new file mode 100644
index 00000000..90c7430b
--- /dev/null
+++ b/windows/ReactNativeVideoCPP61/ReactNativeVideoCPP61.vcxproj
@@ -0,0 +1,169 @@
+
+
+
+
+ true
+ true
+ true
+ {765365e4-9553-4900-9f69-e26d4309c8da}
+ ReactNativeVideoCPP61
+ ReactNativeVideoCPP
+ en-US
+ 14.0
+ true
+ Windows Store
+ 10.0
+ 10.0.18362.0
+ 10.0.15063.0
+
+
+
+ $([MSBuild]::GetDirectoryNameOfFileAbove($(SolutionDir), 'node_modules\react-native-windows\package.json'))\node_modules\react-native-windows\
+
+
+
+ Debug
+ ARM
+
+
+ Debug
+ ARM64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ ARM
+
+
+ Release
+ ARM64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ DynamicLibrary
+ v140
+ v141
+ v142
+ Unicode
+ false
+
+
+ true
+ true
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use
+ pch.h
+ $(IntDir)pch.pch
+ Level4
+ %(AdditionalOptions) /bigobj
+
+ /DWINRT_NO_MAKE_DETECTION %(AdditionalOptions)
+ 28204
+ _WINRT_DLL;RNW61;%(PreprocessorDefinitions)
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+
+
+ Console
+ true
+ ..\ReactNativeVideoCPP\ReactNativeVideoCPP.def
+
+
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ ProgramDatabase
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+
+
+ ..\ReactNativeVideoCPP\ReactVideoView.idl
+
+
+
+
+ ..\ReactNativeVideoCPP\ReactPackageProvider.idl
+
+
+
+
+ ..\ReactNativeVideoCPP\ReactVideoView.idl
+
+
+
+ Create
+
+
+ ..\ReactNativeVideoCPP\ReactPackageProvider.idl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {f7d32bd0-2749-483e-9a0d-1635ef7e3136}
+ false
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
\ No newline at end of file
diff --git a/windows/ReactNativeVideoCPP61/ReactNativeVideoCPP61.vcxproj.filters b/windows/ReactNativeVideoCPP61/ReactNativeVideoCPP61.vcxproj.filters
new file mode 100644
index 00000000..cc45f808
--- /dev/null
+++ b/windows/ReactNativeVideoCPP61/ReactNativeVideoCPP61.vcxproj.filters
@@ -0,0 +1,36 @@
+
+
+
+
+ accd3aa8-1ba0-4223-9bbe-0c431709210b
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tga;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {926ab91d-31b4-48c3-b9a4-e681349f27f0}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/windows/ReactNativeVideoCPP61/packages.config b/windows/ReactNativeVideoCPP61/packages.config
new file mode 100644
index 00000000..9a69657f
--- /dev/null
+++ b/windows/ReactNativeVideoCPP61/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/windows/ReactNativeVideoCPP62.sln b/windows/ReactNativeVideoCPP62.sln
new file mode 100644
index 00000000..4ab5516d
--- /dev/null
+++ b/windows/ReactNativeVideoCPP62.sln
@@ -0,0 +1,254 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30114.105
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeVideoCPP", "ReactNativeVideoCPP\ReactNativeVideoCPP.vcxproj", "{0D1E54D3-4BE1-4DAF-98BF-124C28C85014}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReactNative", "ReactNative", "{4F6E56C3-12C5-4457-9239-0ACF0B7150A8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\node_modules\react-native-windows\Common\Common.vcxproj", "{FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Folly", "..\node_modules\react-native-windows\Folly\Folly.vcxproj", "{A990658C-CE31-4BCC-976F-0FC6B1AF693D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Universal", "..\node_modules\react-native-windows\JSI\Universal\JSI.Universal.vcxproj", "{A62D504A-16B8-41D2-9F19-E2E86019E5E4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Shared", "..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems", "{0CC28589-39E4-4288-B162-97B959F8B843}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra", "..\node_modules\react-native-windows\Chakra\Chakra.vcxitems", "{C38970C0-5FBF-4D69-90D8-CBAC225AE895}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative", "..\node_modules\react-native-windows\Microsoft.ReactNative\Microsoft.ReactNative.vcxproj", "{F7D32BD0-2749-483E-9A0D-1635EF7E3136}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\react-native-windows\Mso\Mso.vcxitems", "{84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactCommon", "..\node_modules\react-native-windows\ReactCommon\ReactCommon.vcxproj", "{A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Cxx", "..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems", "{DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shared", "..\node_modules\react-native-windows\Shared\Shared.vcxitems", "{2049DBE9-8D13-42C9-AE4B-413AE38FFFD0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactWindowsCore", "..\node_modules\react-native-windows\ReactWindowsCore\ReactWindowsCore.vcxproj", "{11C084A3-A57C-4296-A679-CAC17B603144}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Include", "..\node_modules\react-native-windows\include\Include.vcxitems", "{EF074BA1-2D54-4D49-A28E-5E040B47CD2E}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{0cc28589-39e4-4288-b162-97b959f8b843}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\ReactWindowsCore\ReactWindowsCore.vcxitems*{11c084a3-a57c-4296-a679-cac17b603144}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{2049dbe9-8d13-42c9-ae4b-413ae38fffd0}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{84e05bfa-cbaf-4f0d-bfb6-4ce85742a57e}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{a62d504a-16b8-41d2-9f19-e2e86019e5e4}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{c38970c0-5fbf-4d69-90d8-cbac225ae895}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{da8b35b3-da00-4b02-bde6-6a397b3fd46b}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\include\Include.vcxitems*{ef074ba1-2d54-4d49-a28e-5e040b47cd2e}*SharedItemsImports = 9
+ ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ WinUI3|ARM = WinUI3|ARM
+ WinUI3|ARM64 = WinUI3|ARM64
+ WinUI3|x64 = WinUI3|x64
+ WinUI3|x86 = WinUI3|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM.ActiveCfg = Debug|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM.Build.0 = Debug|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|ARM64.Build.0 = Debug|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x64.ActiveCfg = Debug|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x64.Build.0 = Debug|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x86.ActiveCfg = Debug|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Debug|x86.Build.0 = Debug|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM.ActiveCfg = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM.Build.0 = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM64.ActiveCfg = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|ARM64.Build.0 = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x64.ActiveCfg = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x64.Build.0 = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x86.ActiveCfg = Release|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.Release|x86.Build.0 = Release|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM.Build.0 = Release|ARM
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x64.ActiveCfg = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x64.Build.0 = Release|x64
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x86.ActiveCfg = Release|Win32
+ {0D1E54D3-4BE1-4DAF-98BF-124C28C85014}.WinUI3|x86.Build.0 = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.Build.0 = Debug|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.ActiveCfg = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.Build.0 = Debug|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.ActiveCfg = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.Build.0 = Debug|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.ActiveCfg = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.Build.0 = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.Build.0 = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.ActiveCfg = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM.Build.0 = Release|ARM
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x64.ActiveCfg = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x64.Build.0 = Release|x64
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x86.ActiveCfg = Release|Win32
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.WinUI3|x86.Build.0 = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.ActiveCfg = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.Build.0 = Debug|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.ActiveCfg = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.Build.0 = Debug|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.ActiveCfg = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.Build.0 = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.Build.0 = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.ActiveCfg = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.Build.0 = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.ActiveCfg = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.Build.0 = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM.Build.0 = Release|ARM
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x64.ActiveCfg = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x64.Build.0 = Release|x64
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x86.ActiveCfg = Release|Win32
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.WinUI3|x86.Build.0 = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.Build.0 = Debug|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.ActiveCfg = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.Build.0 = Debug|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.ActiveCfg = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.Build.0 = Debug|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.ActiveCfg = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.Build.0 = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.Build.0 = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.ActiveCfg = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.Build.0 = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.ActiveCfg = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.Build.0 = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM.Build.0 = Release|ARM
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x64.ActiveCfg = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x64.Build.0 = Release|x64
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x86.ActiveCfg = Release|Win32
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.WinUI3|x86.Build.0 = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.ActiveCfg = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.Build.0 = Debug|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.Build.0 = Debug|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.ActiveCfg = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.Build.0 = Debug|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.ActiveCfg = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.Build.0 = Debug|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.ActiveCfg = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.Build.0 = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.ActiveCfg = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.Build.0 = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.ActiveCfg = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.Build.0 = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.ActiveCfg = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.Build.0 = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM.Build.0 = Release|ARM
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x64.ActiveCfg = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x64.Build.0 = Release|x64
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x86.ActiveCfg = Release|Win32
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.WinUI3|x86.Build.0 = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.Build.0 = Debug|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.Build.0 = Debug|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.ActiveCfg = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.Build.0 = Debug|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.ActiveCfg = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.Build.0 = Debug|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.ActiveCfg = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.Build.0 = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.ActiveCfg = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.Build.0 = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.ActiveCfg = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.Build.0 = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.ActiveCfg = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.Build.0 = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM.ActiveCfg = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM.Build.0 = Release|ARM
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM64.ActiveCfg = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|ARM64.Build.0 = Release|ARM64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x64.ActiveCfg = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x64.Build.0 = Release|x64
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x86.ActiveCfg = Release|Win32
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.WinUI3|x86.Build.0 = Release|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM.ActiveCfg = Debug|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM.Build.0 = Debug|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|ARM64.Build.0 = Debug|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x64.ActiveCfg = Debug|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x64.Build.0 = Debug|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x86.ActiveCfg = Debug|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Debug|x86.Build.0 = Debug|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM.ActiveCfg = Release|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM.Build.0 = Release|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM64.ActiveCfg = Release|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|ARM64.Build.0 = Release|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x64.ActiveCfg = Release|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x64.Build.0 = Release|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x86.ActiveCfg = Release|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.Release|x86.Build.0 = Release|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|ARM.ActiveCfg = WinUI3|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|ARM.Build.0 = WinUI3|ARM
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|ARM64.ActiveCfg = WinUI3|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|ARM64.Build.0 = WinUI3|ARM64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|x64.ActiveCfg = WinUI3|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|x64.Build.0 = WinUI3|x64
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|x86.ActiveCfg = WinUI3|Win32
+ {11C084A3-A57C-4296-A679-CAC17B603144}.WinUI3|x86.Build.0 = WinUI3|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {A62D504A-16B8-41D2-9F19-E2E86019E5E4} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {0CC28589-39E4-4288-B162-97B959F8B843} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {C38970C0-5FBF-4D69-90D8-CBAC225AE895} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {2049DBE9-8D13-42C9-AE4B-413AE38FFFD0} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {11C084A3-A57C-4296-A679-CAC17B603144} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ {EF074BA1-2D54-4D49-A28E-5E040B47CD2E} = {4F6E56C3-12C5-4457-9239-0ACF0B7150A8}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {BA6749D3-A890-4136-BFD8-0D660E903803}
+ EndGlobalSection
+EndGlobal