react-native-webrtc-nitro 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/webrtc/HybridCamera.kt +0 -1
- package/android/src/main/java/com/webrtc/HybridMicrophone.kt +0 -1
- package/android/src/main/java/com/webrtc/HybridPermissions.kt +95 -0
- package/cpp/FFmpeg/Muxer.cpp +1 -1
- package/cpp/Hybrid/HybridMediaDevices.cpp +23 -19
- package/cpp/Hybrid/HybridMediaRecorder.cpp +118 -0
- package/cpp/Hybrid/HybridMediaRecorder.hpp +36 -0
- package/cpp/__tests__/FFmpeg/testMuxer.cpp +18 -32
- package/ios/HybridCamera.swift +1 -3
- package/ios/HybridMicrophone.swift +1 -3
- package/ios/HybridPermissions.swift +63 -0
- package/lib/commonjs/index.js +22 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/MediaRecorder.nitro.js +16 -0
- package/lib/commonjs/specs/MediaRecorder.nitro.js.map +1 -0
- package/lib/commonjs/specs/Permissions.nitro.js +9 -0
- package/lib/commonjs/specs/Permissions.nitro.js.map +1 -0
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/MediaRecorder.nitro.js +13 -0
- package/lib/module/specs/MediaRecorder.nitro.js.map +1 -0
- package/lib/module/specs/Permissions.nitro.js +6 -0
- package/lib/module/specs/Permissions.nitro.js.map +1 -0
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/MediaRecorder.nitro.d.ts +17 -0
- package/lib/typescript/src/specs/MediaRecorder.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/Permissions.nitro.d.ts +17 -0
- package/lib/typescript/src/specs/Permissions.nitro.d.ts.map +1 -0
- package/nitro.json +7 -0
- package/nitrogen/generated/android/Webrtc+autolinking.cmake +3 -0
- package/nitrogen/generated/android/WebrtcOnLoad.cpp +20 -0
- package/nitrogen/generated/android/c++/JHybridPermissionsSpec.cpp +91 -0
- package/nitrogen/generated/android/c++/JHybridPermissionsSpec.hpp +66 -0
- package/nitrogen/generated/android/c++/JPermissionDescriptor.hpp +58 -0
- package/nitrogen/generated/android/c++/JPermissionName.hpp +59 -0
- package/nitrogen/generated/android/c++/JPermissionState.hpp +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/HybridPermissionsSpec.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/PermissionDescriptor.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/PermissionName.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/PermissionState.kt +22 -0
- package/nitrogen/generated/ios/Webrtc-Swift-Cxx-Bridge.cpp +25 -0
- package/nitrogen/generated/ios/Webrtc-Swift-Cxx-Bridge.hpp +63 -0
- package/nitrogen/generated/ios/Webrtc-Swift-Cxx-Umbrella.hpp +14 -0
- package/nitrogen/generated/ios/WebrtcAutolinking.mm +18 -0
- package/nitrogen/generated/ios/WebrtcAutolinking.swift +15 -0
- package/nitrogen/generated/ios/c++/HybridPermissionsSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridPermissionsSpecSwift.hpp +92 -0
- package/nitrogen/generated/ios/swift/Func_void_PermissionState.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridPermissionsSpec.swift +57 -0
- package/nitrogen/generated/ios/swift/HybridPermissionsSpec_cxx.swift +157 -0
- package/nitrogen/generated/ios/swift/PermissionDescriptor.swift +36 -0
- package/nitrogen/generated/ios/swift/PermissionName.swift +40 -0
- package/nitrogen/generated/ios/swift/PermissionState.swift +44 -0
- package/nitrogen/generated/shared/c++/HybridMediaRecorderSpec.cpp +25 -0
- package/nitrogen/generated/shared/c++/HybridMediaRecorderSpec.hpp +69 -0
- package/nitrogen/generated/shared/c++/HybridPermissionsSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridPermissionsSpec.hpp +68 -0
- package/nitrogen/generated/shared/c++/PermissionDescriptor.hpp +76 -0
- package/nitrogen/generated/shared/c++/PermissionName.hpp +76 -0
- package/nitrogen/generated/shared/c++/PermissionState.hpp +80 -0
- package/package.json +4 -5
- package/src/index.ts +2 -0
- package/src/specs/MediaRecorder.nitro.ts +24 -0
- package/src/specs/Permissions.nitro.ts +22 -0
- package/android/src/main/java/com/webrtc/Permission.kt +0 -58
- package/ios/Permission.swift +0 -26
|
@@ -35,7 +35,6 @@ class HybridMicrophone : HybridMicrophoneSpec() {
|
|
|
35
35
|
override fun open(pipeId: String): Promise<Unit> {
|
|
36
36
|
this.pipeId = pipeId
|
|
37
37
|
return Promise.async {
|
|
38
|
-
requestPermission(android.Manifest.permission.RECORD_AUDIO)
|
|
39
38
|
|
|
40
39
|
audioRecord = AudioRecord(
|
|
41
40
|
MediaRecorder.AudioSource.VOICE_COMMUNICATION,
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
package com.webrtc
|
|
2
|
+
|
|
3
|
+
import android.content.pm.PackageManager
|
|
4
|
+
import androidx.core.content.ContextCompat
|
|
5
|
+
import androidx.annotation.Keep
|
|
6
|
+
import com.facebook.react.modules.core.PermissionAwareActivity
|
|
7
|
+
import com.facebook.react.modules.core.PermissionListener
|
|
8
|
+
import com.facebook.proguard.annotations.DoNotStrip
|
|
9
|
+
import kotlin.random.Random
|
|
10
|
+
import kotlinx.coroutines.CompletableDeferred
|
|
11
|
+
import kotlinx.coroutines.Dispatchers
|
|
12
|
+
import kotlinx.coroutines.withContext
|
|
13
|
+
import com.margelo.nitro.NitroModules
|
|
14
|
+
import com.margelo.nitro.core.Promise
|
|
15
|
+
import com.margelo.nitro.webrtc.HybridPermissionsSpec
|
|
16
|
+
import com.margelo.nitro.webrtc.PermissionDescriptor
|
|
17
|
+
import com.margelo.nitro.webrtc.PermissionState
|
|
18
|
+
import com.margelo.nitro.webrtc.PermissionName
|
|
19
|
+
|
|
20
|
+
@Keep
|
|
21
|
+
@DoNotStrip
|
|
22
|
+
class HybridPermissions : HybridPermissionsSpec() {
|
|
23
|
+
|
|
24
|
+
override fun query(permissionDesc: PermissionDescriptor): Promise<PermissionState> {
|
|
25
|
+
return Promise.async {
|
|
26
|
+
val permission = when (permissionDesc.name) {
|
|
27
|
+
PermissionName.MICROPHONE -> android.Manifest.permission.RECORD_AUDIO
|
|
28
|
+
PermissionName.CAMERA -> android.Manifest.permission.CAMERA
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
val context = NitroModules.applicationContext
|
|
32
|
+
?: throw RuntimeException("ReactApplicationContext is not available")
|
|
33
|
+
|
|
34
|
+
val currentActivity = context.currentActivity
|
|
35
|
+
?: throw RuntimeException("No current Activity")
|
|
36
|
+
val status = ContextCompat.checkSelfPermission(context, permission)
|
|
37
|
+
|
|
38
|
+
if (status == PackageManager.PERMISSION_GRANTED) {
|
|
39
|
+
PermissionState.GRANTED
|
|
40
|
+
} else if (status == PackageManager.PERMISSION_DENIED && !currentActivity.shouldShowRequestPermissionRationale(
|
|
41
|
+
permission
|
|
42
|
+
)
|
|
43
|
+
) {
|
|
44
|
+
PermissionState.PROMPT
|
|
45
|
+
} else {
|
|
46
|
+
PermissionState.DENIED
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
override fun request(permissionDesc: PermissionDescriptor): Promise<PermissionState> {
|
|
52
|
+
return Promise.async {
|
|
53
|
+
val permission = when (permissionDesc.name) {
|
|
54
|
+
PermissionName.MICROPHONE -> android.Manifest.permission.RECORD_AUDIO
|
|
55
|
+
PermissionName.CAMERA -> android.Manifest.permission.CAMERA
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
val context = NitroModules.applicationContext
|
|
59
|
+
?: throw RuntimeException("ReactApplicationContext is not available")
|
|
60
|
+
|
|
61
|
+
val currentActivity = context.currentActivity
|
|
62
|
+
?: throw RuntimeException("No current Activity")
|
|
63
|
+
|
|
64
|
+
if (currentActivity !is PermissionAwareActivity) {
|
|
65
|
+
throw RuntimeException("Current activity doesn't support permissions")
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
val code = Random.nextInt(0, 1000)
|
|
69
|
+
val deferred = CompletableDeferred<PermissionState>()
|
|
70
|
+
|
|
71
|
+
val listener = object : PermissionListener {
|
|
72
|
+
override fun onRequestPermissionsResult(
|
|
73
|
+
requestCode: Int,
|
|
74
|
+
permissions: Array<String>,
|
|
75
|
+
grantResults: IntArray
|
|
76
|
+
): Boolean {
|
|
77
|
+
if (requestCode != code) return false
|
|
78
|
+
|
|
79
|
+
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
80
|
+
deferred.complete(PermissionState.GRANTED)
|
|
81
|
+
} else {
|
|
82
|
+
deferred.complete(PermissionState.DENIED)
|
|
83
|
+
}
|
|
84
|
+
return true
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
withContext(Dispatchers.Main) {
|
|
89
|
+
currentActivity.requestPermissions(arrayOf(permission), code, listener)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
deferred.await()
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
package/cpp/FFmpeg/Muxer.cpp
CHANGED
|
@@ -10,25 +10,29 @@ auto
|
|
|
10
10
|
HybridMediaDevices::getMockMedia (const MediaStreamConstraints &constraints)
|
|
11
11
|
-> std::shared_ptr<Promise<std::shared_ptr<HybridMediaStreamSpec>>>
|
|
12
12
|
{
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
13
|
+
return Promise<std::shared_ptr<HybridMediaStreamSpec>>::async (
|
|
14
|
+
[constraints] ()
|
|
15
|
+
{
|
|
16
|
+
auto hybridMediaStreams = std::make_shared<HybridMediaStream> ();
|
|
17
|
+
if (constraints.audio.value_or (false))
|
|
18
|
+
{
|
|
19
|
+
auto hybridAudioTrack
|
|
20
|
+
= std::make_shared<HybridMediaStreamTrack> ("audio");
|
|
21
|
+
hybridAudioTrack->mockMicrophone
|
|
22
|
+
= std::make_shared<MockMicrophone> (
|
|
23
|
+
hybridAudioTrack->get_srcPipeId ());
|
|
24
|
+
hybridMediaStreams->addTrack (hybridAudioTrack);
|
|
25
|
+
}
|
|
26
|
+
if (constraints.video.value_or (false))
|
|
27
|
+
{
|
|
28
|
+
auto hybridVideoTrack
|
|
29
|
+
= std::make_shared<HybridMediaStreamTrack> ("video");
|
|
30
|
+
hybridVideoTrack->mockCamera = std::make_shared<MockCamera> (
|
|
31
|
+
hybridVideoTrack->get_srcPipeId ());
|
|
32
|
+
hybridMediaStreams->addTrack (hybridVideoTrack);
|
|
33
|
+
}
|
|
34
|
+
return hybridMediaStreams;
|
|
35
|
+
});
|
|
32
36
|
};
|
|
33
37
|
|
|
34
38
|
auto
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#include "HybridMediaRecorder.hpp"
|
|
2
|
+
#include "FramePipe.hpp"
|
|
3
|
+
#include <filesystem>
|
|
4
|
+
|
|
5
|
+
using namespace margelo::nitro::webrtc;
|
|
6
|
+
|
|
7
|
+
auto HybridMediaRecorder::takePhoto (const std::string &file)
|
|
8
|
+
-> std::shared_ptr<Promise<void>>
|
|
9
|
+
{
|
|
10
|
+
if (mediaStream == nullptr)
|
|
11
|
+
{
|
|
12
|
+
throw std::runtime_error (
|
|
13
|
+
"MediaStream is not set for HybridMediaRecorder");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (std::filesystem::path (file).extension () != ".png")
|
|
17
|
+
{
|
|
18
|
+
throw std::invalid_argument ("Only .png format is supported");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
auto tracks = mediaStream->getVideoTracks ();
|
|
22
|
+
if (tracks.empty ())
|
|
23
|
+
{
|
|
24
|
+
throw std::runtime_error ("No video tracks available in MediaStream");
|
|
25
|
+
}
|
|
26
|
+
std::string srcPipeId = tracks[0]->get_srcPipeId ();
|
|
27
|
+
return Promise<void>::async (
|
|
28
|
+
[this, srcPipeId, file] () -> void
|
|
29
|
+
{
|
|
30
|
+
auto encoder = std::make_shared<FFmpeg::Encoder> (AV_CODEC_ID_PNG);
|
|
31
|
+
FrameCallback callback =
|
|
32
|
+
[this, encoder, file] (const std::string &, int subscriptionId,
|
|
33
|
+
const FFmpeg::Frame &frame)
|
|
34
|
+
{
|
|
35
|
+
FILE *f = fopen (file.c_str (), "wb");
|
|
36
|
+
if (!f)
|
|
37
|
+
{
|
|
38
|
+
throw std::invalid_argument ("Failed to open file " + file
|
|
39
|
+
+ " for writing");
|
|
40
|
+
}
|
|
41
|
+
encoder->send (frame);
|
|
42
|
+
encoder->flush ();
|
|
43
|
+
for (const FFmpeg::Packet &packet : encoder->receive ())
|
|
44
|
+
{
|
|
45
|
+
fwrite (packet->data, 1, packet->size, f);
|
|
46
|
+
}
|
|
47
|
+
fclose (f);
|
|
48
|
+
::unsubscribe (subscriptionId);
|
|
49
|
+
this->subscriptionId = -1;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
this->subscriptionId
|
|
53
|
+
= subscribe ({ srcPipeId }, callback, nullptr);
|
|
54
|
+
|
|
55
|
+
// wait for the callback to be called
|
|
56
|
+
while (this->subscriptionId != -1)
|
|
57
|
+
{
|
|
58
|
+
std::this_thread::sleep_for (std::chrono::milliseconds (10));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void HybridMediaRecorder::startRecording (const std::string &file)
|
|
64
|
+
{
|
|
65
|
+
if (mediaStream == nullptr)
|
|
66
|
+
{
|
|
67
|
+
throw std::runtime_error (
|
|
68
|
+
"MediaStream is not set for HybridMediaRecorder");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (std::filesystem::path (file).extension () != ".mp4")
|
|
72
|
+
{
|
|
73
|
+
throw std::invalid_argument ("Only .mp4 format is supported c++");
|
|
74
|
+
}
|
|
75
|
+
AVCodecID audioCodecId = AV_CODEC_ID_NONE;
|
|
76
|
+
AVCodecID videoCodecId = AV_CODEC_ID_NONE;
|
|
77
|
+
std::string audioPipeId = "";
|
|
78
|
+
std::string videoPipeId = "";
|
|
79
|
+
std::vector<std::string> pipeIds;
|
|
80
|
+
if (!mediaStream->getAudioTracks ().empty ())
|
|
81
|
+
{
|
|
82
|
+
audioPipeId = mediaStream->getAudioTracks ()[0]->get_srcPipeId ();
|
|
83
|
+
pipeIds.push_back (audioPipeId);
|
|
84
|
+
audioCodecId = AV_CODEC_ID_AAC;
|
|
85
|
+
}
|
|
86
|
+
if (!mediaStream->getVideoTracks ().empty ())
|
|
87
|
+
{
|
|
88
|
+
videoPipeId = mediaStream->getVideoTracks ()[0]->get_srcPipeId ();
|
|
89
|
+
pipeIds.push_back (videoPipeId);
|
|
90
|
+
videoCodecId = AV_CODEC_ID_H264;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
auto muxer
|
|
94
|
+
= std::make_shared<FFmpeg::Muxer> (file, audioCodecId, videoCodecId);
|
|
95
|
+
FrameCallback callback
|
|
96
|
+
= [muxer, audioPipeId, videoPipeId] (const std::string &pipeId, int,
|
|
97
|
+
const FFmpeg::Frame &frame)
|
|
98
|
+
{
|
|
99
|
+
if (pipeId == audioPipeId)
|
|
100
|
+
{
|
|
101
|
+
muxer->writeAudio (frame);
|
|
102
|
+
}
|
|
103
|
+
if (pipeId == videoPipeId)
|
|
104
|
+
{
|
|
105
|
+
muxer->writeVideo (frame);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
CleanupCallback cleanup = [muxer] (int) { muxer->stop (); };
|
|
110
|
+
|
|
111
|
+
subscriptionId = subscribe (pipeIds, callback, cleanup);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
void HybridMediaRecorder::stopRecording ()
|
|
115
|
+
{
|
|
116
|
+
unsubscribe (subscriptionId);
|
|
117
|
+
subscriptionId = -1;
|
|
118
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#include "HybridMediaRecorderSpec.hpp"
|
|
3
|
+
#include "HybridMediaStream.hpp"
|
|
4
|
+
#include <NitroModules/Promise.hpp>
|
|
5
|
+
|
|
6
|
+
namespace margelo::nitro::webrtc
|
|
7
|
+
{
|
|
8
|
+
class HybridMediaRecorder : public HybridMediaRecorderSpec
|
|
9
|
+
{
|
|
10
|
+
private:
|
|
11
|
+
std::shared_ptr<HybridMediaStream> mediaStream = nullptr;
|
|
12
|
+
int subscriptionId = -1;
|
|
13
|
+
|
|
14
|
+
public:
|
|
15
|
+
HybridMediaRecorder () : HybridObject (TAG), HybridMediaRecorderSpec ()
|
|
16
|
+
{
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
auto getStream () -> std::shared_ptr<HybridMediaStreamSpec> override
|
|
20
|
+
{
|
|
21
|
+
return mediaStream;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
void setStream (
|
|
25
|
+
const std::shared_ptr<HybridMediaStreamSpec> &mediaStream) override
|
|
26
|
+
{
|
|
27
|
+
this->mediaStream
|
|
28
|
+
= std::dynamic_pointer_cast<HybridMediaStream> (mediaStream);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
auto takePhoto (const std::string &file)
|
|
32
|
+
-> std::shared_ptr<Promise<void>> override;
|
|
33
|
+
void startRecording (const std::string &file) override;
|
|
34
|
+
void stopRecording () override;
|
|
35
|
+
};
|
|
36
|
+
} // namespace margelo::nitro::webrtc
|
|
@@ -11,13 +11,16 @@ constexpr int HEIGHT = 480;
|
|
|
11
11
|
|
|
12
12
|
TEST (MuxerTest, testMuxerAAC)
|
|
13
13
|
{
|
|
14
|
-
std::string file =
|
|
14
|
+
std::string file = "test_aac.mp4";
|
|
15
15
|
Muxer muxer (file, AV_CODEC_ID_AAC, AV_CODEC_ID_NONE);
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
for (int i = 0; i < 1000; ++i)
|
|
18
|
+
{
|
|
19
|
+
Frame inputFrame (AV_SAMPLE_FMT_FLT, AUDIO_SAMPLE_RATE, 1,
|
|
20
|
+
AUDIO_NB_SAMPLES, i * AUDIO_NB_SAMPLES);
|
|
21
|
+
inputFrame.fillNoise ();
|
|
22
|
+
muxer.writeAudio (inputFrame);
|
|
23
|
+
}
|
|
21
24
|
muxer.stop ();
|
|
22
25
|
|
|
23
26
|
EXPECT_TRUE (std::filesystem::exists (file));
|
|
@@ -25,46 +28,29 @@ TEST (MuxerTest, testMuxerAAC)
|
|
|
25
28
|
|
|
26
29
|
TEST (MuxerTest, testMuxerH264)
|
|
27
30
|
{
|
|
28
|
-
std::string file =
|
|
29
|
-
|
|
31
|
+
std::string file = "test_h264.mp4";
|
|
30
32
|
Muxer muxer (file, AV_CODEC_ID_NONE, AV_CODEC_ID_H264);
|
|
31
|
-
Frame inputFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT);
|
|
32
|
-
inputFrame.fillNoise ();
|
|
33
|
-
muxer.writeVideo (inputFrame);
|
|
34
|
-
muxer.stop ();
|
|
35
|
-
|
|
36
|
-
EXPECT_TRUE (std::filesystem::exists (file));
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
TEST (MuxerTest, testMuxerVideo)
|
|
40
|
-
{
|
|
41
|
-
std::string file = testing::TempDir () + "/test_file.mp4";
|
|
42
|
-
Muxer muxer (file, AV_CODEC_ID_AAC, AV_CODEC_ID_H264);
|
|
43
|
-
|
|
44
|
-
Frame audioFrame (AV_SAMPLE_FMT_FLT, AUDIO_SAMPLE_RATE, 1,
|
|
45
|
-
AUDIO_NB_SAMPLES);
|
|
46
|
-
Frame videoFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT);
|
|
47
|
-
audioFrame.fillNoise ();
|
|
48
|
-
videoFrame.fillNoise ();
|
|
49
|
-
muxer.writeAudio (audioFrame);
|
|
50
|
-
muxer.writeVideo (videoFrame);
|
|
51
33
|
|
|
34
|
+
for (int i = 0; i < 1000; ++i)
|
|
35
|
+
{
|
|
36
|
+
Frame inputFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT, i * 3000);
|
|
37
|
+
inputFrame.fillNoise ();
|
|
38
|
+
muxer.writeVideo (inputFrame);
|
|
39
|
+
}
|
|
52
40
|
muxer.stop ();
|
|
53
41
|
EXPECT_TRUE (std::filesystem::exists (file));
|
|
54
42
|
}
|
|
55
43
|
|
|
56
|
-
TEST (MuxerTest,
|
|
44
|
+
TEST (MuxerTest, testMuxerVideo)
|
|
57
45
|
{
|
|
58
46
|
std::string file = "output.mp4";
|
|
59
47
|
Muxer muxer (file, AV_CODEC_ID_AAC, AV_CODEC_ID_H264);
|
|
60
|
-
constexpr int LOOPS = 1000;
|
|
61
|
-
constexpr int VIDEO_SAMPLES = 3000;
|
|
62
48
|
|
|
63
|
-
for (int i = 0; i <
|
|
49
|
+
for (int i = 0; i < 1000; ++i)
|
|
64
50
|
{
|
|
65
51
|
Frame audioFrame (AV_SAMPLE_FMT_FLT, AUDIO_SAMPLE_RATE, 1,
|
|
66
52
|
AUDIO_NB_SAMPLES, i * AUDIO_NB_SAMPLES);
|
|
67
|
-
Frame videoFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT, i *
|
|
53
|
+
Frame videoFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT, i * 3000);
|
|
68
54
|
audioFrame.fillNoise ();
|
|
69
55
|
videoFrame.fillNoise ();
|
|
70
56
|
muxer.writeAudio (audioFrame);
|
package/ios/HybridCamera.swift
CHANGED
|
@@ -95,10 +95,8 @@ public class HybridCamera: HybridCameraSpec {
|
|
|
95
95
|
throw RuntimeError.error(withMessage: "Pipe ID cannot be empty")
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
try cameraManager.prepare()
|
|
99
|
-
|
|
100
98
|
return Promise.async {
|
|
101
|
-
try
|
|
99
|
+
try self.cameraManager.prepare()
|
|
102
100
|
self.pipeId = pipeId
|
|
103
101
|
self.cameraManager.addActivePipeId(pipeId)
|
|
104
102
|
}
|
|
@@ -87,10 +87,8 @@ public class HybridMicrophone: HybridMicrophoneSpec {
|
|
|
87
87
|
throw RuntimeError.error(withMessage: "Pipe ID cannot be empty")
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
try microphoneManager.prepare()
|
|
91
|
-
|
|
92
90
|
return Promise.async {
|
|
93
|
-
try
|
|
91
|
+
try self.microphoneManager.prepare()
|
|
94
92
|
self.pipeId = pipeId
|
|
95
93
|
self.microphoneManager.addActivePipeId(pipeId)
|
|
96
94
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HybridPermissions.swift
|
|
3
|
+
// Pods
|
|
4
|
+
//
|
|
5
|
+
// Created by kaizhi-singtown on 2025/11/27.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import NitroModules
|
|
10
|
+
|
|
11
|
+
public class HybridPermissions: HybridPermissionsSpec {
|
|
12
|
+
public func query(permissionDesc: PermissionDescriptor) throws -> Promise<PermissionState> {
|
|
13
|
+
return Promise.async {
|
|
14
|
+
|
|
15
|
+
let mediaType: AVMediaType
|
|
16
|
+
switch permissionDesc.name {
|
|
17
|
+
case .camera:
|
|
18
|
+
mediaType = .video
|
|
19
|
+
case .microphone:
|
|
20
|
+
mediaType = .audio
|
|
21
|
+
default:
|
|
22
|
+
return .denied
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let status = AVCaptureDevice.authorizationStatus(for: mediaType)
|
|
26
|
+
switch status {
|
|
27
|
+
case .authorized:
|
|
28
|
+
return .granted
|
|
29
|
+
case .denied, .restricted:
|
|
30
|
+
return .denied
|
|
31
|
+
case .notDetermined:
|
|
32
|
+
return .prompt
|
|
33
|
+
@unknown default:
|
|
34
|
+
return .denied
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public func request(permissionDesc: PermissionDescriptor) throws -> Promise<PermissionState> {
|
|
40
|
+
return Promise.async {
|
|
41
|
+
let mediaType: AVMediaType
|
|
42
|
+
switch permissionDesc.name {
|
|
43
|
+
case .camera:
|
|
44
|
+
mediaType = .video
|
|
45
|
+
case .microphone:
|
|
46
|
+
mediaType = .audio
|
|
47
|
+
default:
|
|
48
|
+
return .denied
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let granted = await withCheckedContinuation { (continuation) in
|
|
52
|
+
AVCaptureDevice.requestAccess(for: mediaType) { ok in
|
|
53
|
+
continuation.resume(returning: ok)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if granted {
|
|
57
|
+
return .granted
|
|
58
|
+
} else {
|
|
59
|
+
return .denied
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -14,6 +14,17 @@ Object.keys(_WebrtcView).forEach(function (key) {
|
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
16
|
});
|
|
17
|
+
var _Permissions = require("./specs/Permissions.nitro");
|
|
18
|
+
Object.keys(_Permissions).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _Permissions[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _Permissions[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
17
28
|
var _MediaDevices = require("./specs/MediaDevices.nitro");
|
|
18
29
|
Object.keys(_MediaDevices).forEach(function (key) {
|
|
19
30
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -91,4 +102,15 @@ Object.keys(_RTCRtpTransceiver).forEach(function (key) {
|
|
|
91
102
|
}
|
|
92
103
|
});
|
|
93
104
|
});
|
|
105
|
+
var _MediaRecorder = require("./specs/MediaRecorder.nitro");
|
|
106
|
+
Object.keys(_MediaRecorder).forEach(function (key) {
|
|
107
|
+
if (key === "default" || key === "__esModule") return;
|
|
108
|
+
if (key in exports && exports[key] === _MediaRecorder[key]) return;
|
|
109
|
+
Object.defineProperty(exports, key, {
|
|
110
|
+
enumerable: true,
|
|
111
|
+
get: function () {
|
|
112
|
+
return _MediaRecorder[key];
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
94
116
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_WebrtcView","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_MediaDevices","_MediaStream","_MediaStreamTrack","_RTCPeerConnection","_RTCRtpSender","_RTCRtpReceiver","_RTCRtpTransceiver"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,WAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,WAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,WAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,
|
|
1
|
+
{"version":3,"names":["_WebrtcView","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_Permissions","_MediaDevices","_MediaStream","_MediaStreamTrack","_RTCPeerConnection","_RTCRtpSender","_RTCRtpReceiver","_RTCRtpTransceiver","_MediaRecorder"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,WAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,WAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,WAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,YAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,YAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,YAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,YAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,aAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,aAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,aAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,aAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AACA,IAAAO,YAAA,GAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,YAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,YAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,YAAA,CAAAP,GAAA;IAAA;EAAA;AAAA;AACA,IAAAQ,iBAAA,GAAAZ,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAU,iBAAA,EAAAT,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAQ,iBAAA,CAAAR,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAI,iBAAA,CAAAR,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,kBAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,kBAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAS,kBAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAK,kBAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,aAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,aAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAU,aAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAM,aAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AACA,IAAAW,eAAA,GAAAf,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAa,eAAA,EAAAZ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAW,eAAA,CAAAX,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAO,eAAA,CAAAX,GAAA;IAAA;EAAA;AAAA;AACA,IAAAY,kBAAA,GAAAhB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAc,kBAAA,EAAAb,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAY,kBAAA,CAAAZ,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAQ,kBAAA,CAAAZ,GAAA;IAAA;EAAA;AAAA;AACA,IAAAa,cAAA,GAAAjB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAe,cAAA,EAAAd,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAa,cAAA,CAAAb,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAS,cAAA,CAAAb,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.MediaRecorder = void 0;
|
|
7
|
+
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
|
8
|
+
const MediaRecorderConstructor = (0, _reactNativeNitroModules.getHybridObjectConstructor)('MediaRecorder');
|
|
9
|
+
const MediaRecorderExport = exports.MediaRecorder = new Proxy(MediaRecorderConstructor, {
|
|
10
|
+
construct(target, args) {
|
|
11
|
+
const instance = new target();
|
|
12
|
+
instance.stream = args[0];
|
|
13
|
+
return instance;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=MediaRecorder.nitro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeNitroModules","require","MediaRecorderConstructor","getHybridObjectConstructor","MediaRecorderExport","exports","MediaRecorder","Proxy","construct","target","args","instance","stream"],"sourceRoot":"../../../src","sources":["specs/MediaRecorder.nitro.ts"],"mappings":";;;;;;AACA,IAAAA,wBAAA,GAAAC,OAAA;AAUA,MAAMC,wBAAwB,GAC5B,IAAAC,mDAA0B,EAAgB,eAAe,CAAC;AAE5D,MAAMC,mBAAmB,GAAAC,OAAA,CAAAC,aAAA,GAAG,IAAIC,KAAK,CAACL,wBAAwB,EAAE;EAC9DM,SAASA,CAACC,MAAM,EAAEC,IAAI,EAAE;IACtB,MAAMC,QAAQ,GAAG,IAAIF,MAAM,CAAC,CAAC;IAC7BE,QAAQ,CAACC,MAAM,GAAGF,IAAI,CAAC,CAAC,CAAgB;IACxC,OAAOC,QAAQ;EACjB;AACF,CAAC,CAAiD","ignoreList":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Permissions = void 0;
|
|
7
|
+
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
|
8
|
+
const PermissionsExport = exports.Permissions = _reactNativeNitroModules.NitroModules.createHybridObject('Permissions');
|
|
9
|
+
//# sourceMappingURL=Permissions.nitro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeNitroModules","require","PermissionsExport","exports","Permissions","NitroModules","createHybridObject"],"sourceRoot":"../../../src","sources":["specs/Permissions.nitro.ts"],"mappings":";;;;;;AACA,IAAAA,wBAAA,GAAAC,OAAA;AAiBA,MAAMC,iBAAiB,GAAAC,OAAA,CAAAC,WAAA,GACrBC,qCAAY,CAACC,kBAAkB,CAAc,aAAa,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
export * from './views/WebrtcView';
|
|
4
|
+
export * from './specs/Permissions.nitro';
|
|
4
5
|
export * from './specs/MediaDevices.nitro';
|
|
5
6
|
export * from './specs/MediaStream.nitro';
|
|
6
7
|
export * from './specs/MediaStreamTrack.nitro';
|
|
@@ -8,4 +9,5 @@ export * from './specs/RTCPeerConnection.nitro';
|
|
|
8
9
|
export * from './specs/RTCRtpSender.nitro';
|
|
9
10
|
export * from './specs/RTCRtpReceiver.nitro';
|
|
10
11
|
export * from './specs/RTCRtpTransceiver.nitro';
|
|
12
|
+
export * from './specs/MediaRecorder.nitro';
|
|
11
13
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,cAAc,oBAAoB;AAClC,cAAc,4BAA4B;AAC1C,cAAc,2BAA2B;AACzC,cAAc,gCAAgC;AAC9C,cAAc,iCAAiC;AAC/C,cAAc,4BAA4B;AAC1C,cAAc,8BAA8B;AAC5C,cAAc,iCAAiC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,cAAc,oBAAoB;AAClC,cAAc,2BAA2B;AACzC,cAAc,4BAA4B;AAC1C,cAAc,2BAA2B;AACzC,cAAc,gCAAgC;AAC9C,cAAc,iCAAiC;AAC/C,cAAc,4BAA4B;AAC1C,cAAc,8BAA8B;AAC5C,cAAc,iCAAiC;AAC/C,cAAc,6BAA6B","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getHybridObjectConstructor } from 'react-native-nitro-modules';
|
|
4
|
+
const MediaRecorderConstructor = getHybridObjectConstructor('MediaRecorder');
|
|
5
|
+
const MediaRecorderExport = new Proxy(MediaRecorderConstructor, {
|
|
6
|
+
construct(target, args) {
|
|
7
|
+
const instance = new target();
|
|
8
|
+
instance.stream = args[0];
|
|
9
|
+
return instance;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
export { MediaRecorderExport as MediaRecorder };
|
|
13
|
+
//# sourceMappingURL=MediaRecorder.nitro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getHybridObjectConstructor","MediaRecorderConstructor","MediaRecorderExport","Proxy","construct","target","args","instance","stream","MediaRecorder"],"sourceRoot":"../../../src","sources":["specs/MediaRecorder.nitro.ts"],"mappings":";;AACA,SAASA,0BAA0B,QAAQ,4BAA4B;AAUvE,MAAMC,wBAAwB,GAC5BD,0BAA0B,CAAgB,eAAe,CAAC;AAE5D,MAAME,mBAAmB,GAAG,IAAIC,KAAK,CAACF,wBAAwB,EAAE;EAC9DG,SAASA,CAACC,MAAM,EAAEC,IAAI,EAAE;IACtB,MAAMC,QAAQ,GAAG,IAAIF,MAAM,CAAC,CAAC;IAC7BE,QAAQ,CAACC,MAAM,GAAGF,IAAI,CAAC,CAAC,CAAgB;IACxC,OAAOC,QAAQ;EACjB;AACF,CAAC,CAAiD;AAGlD,SAASL,mBAAmB,IAAIO,aAAa","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NitroModules","PermissionsExport","createHybridObject","Permissions"],"sourceRoot":"../../../src","sources":["specs/Permissions.nitro.ts"],"mappings":";;AACA,SAASA,YAAY,QAAQ,4BAA4B;AAiBzD,MAAMC,iBAAiB,GACrBD,YAAY,CAACE,kBAAkB,CAAc,aAAa,CAAC;AAE7D,SAASD,iBAAiB,IAAIE,WAAW","ignoreList":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './views/WebrtcView';
|
|
2
|
+
export * from './specs/Permissions.nitro';
|
|
2
3
|
export * from './specs/MediaDevices.nitro';
|
|
3
4
|
export * from './specs/MediaStream.nitro';
|
|
4
5
|
export * from './specs/MediaStreamTrack.nitro';
|
|
@@ -6,4 +7,5 @@ export * from './specs/RTCPeerConnection.nitro';
|
|
|
6
7
|
export * from './specs/RTCRtpSender.nitro';
|
|
7
8
|
export * from './specs/RTCRtpReceiver.nitro';
|
|
8
9
|
export * from './specs/RTCRtpTransceiver.nitro';
|
|
10
|
+
export * from './specs/MediaRecorder.nitro';
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,6BAA6B,CAAA"}
|