diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb76ef7cac..63fe195530 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -136,7 +136,7 @@ jobs: - name: Install ninja-build libgtk-3-dev run: sudo apt-get install -y ninja-build libgtk-3-dev - name: Install elinux - run: git clone https://github.com/sony/flutter-elinux.git ~/flutter-elinux + run: git clone https://github.com/sony/flutter-elinux.git -b 3.27.1 ~/flutter-elinux - name: Build for elinux working-directory: ./example run: /home/runner/flutter-elinux/bin/flutter-elinux pub get && /home/runner/flutter-elinux/bin/flutter-elinux build elinux diff --git a/.gitignore b/.gitignore index 0bab26c22a..eb6c05cd3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,3 @@ -*.iml -.idea -.DS_Store -example/pubspec.lock -pubspec.lock -example/ios/Podfile.lock -GeneratedPluginRegistrant.java -example/android/.gradle -WorkspaceSettings.xcsettings -example/.flutter-plugins -example/android/local.properties -.dart_tool/package_config.json -android/.project -example/ios/Runner/GeneratedPluginRegistrant.m -example/ios/Runner/GeneratedPluginRegistrant.h -example/ios/Flutter/Generated.xcconfig -example/ios/Flutter/flutter_export_environment.sh - # Miscellaneous *.class *.log @@ -26,6 +8,7 @@ example/ios/Flutter/flutter_export_environment.sh .buildlog/ .history .svn/ +migrate_working_dir/ # IntelliJ related *.iml @@ -33,26 +16,16 @@ example/ios/Flutter/flutter_export_environment.sh *.iws .idea/ +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + # Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock **/doc/api/ .dart_tool/ .flutter-plugins .flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -/build/ -/android/.gradle/ - - -android/.classpath -android/.settings/org.eclipse.buildship.core.prefs - -# VSCode -.vscode/ - -!webrtc_android.iml -!webrtc.iml - -# vs -*.pdb \ No newline at end of file +build/ diff --git a/CHANGELOG.md b/CHANGELOG.md index f319b025a0..edac0eccd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,30 @@ # Changelog +[1.0.0] - 2025-07-25 + +* Bump version to 1.0.0 +* [Native] feat: Upgrade libwebrtc to m137. (#1877). +* [Doc] fix: typo in package description (#1895) +* [Android] fix: Video recording crashing and freezing on Android 14 Devices (#1886) +* [Android] fix: Add audio recording for Android Platform (#1884) +* [Dart] fix: Removed outdated code to avoid UI not being displayed in Windows release mode (#1890) +* [Apple] fix: Fix compile warnings (#1887) +* [Apple] feat: Update to m137 with audio engine (#1875) +* [Android] fix: Ensure both video and audio tracks are added before starting the muxer (#1879) + +[0.14.2] - 2025-07-01 + +* [Windows/Linux] feat: Add audio processing and sink API for cpp. (#1867) +* [Linux] fix: Fixed audio device selection error for Linux. (#1864) +* [Android] fix: Fix screen capture orientation for landscape-native devices (#1854) + +[0.14.1] - 2025-05-22 + +* [Android] fix: Recording bug (#1839) +* [Android] fix: calls in terminated mode by disabling orientation manager (#1840) +* [Android] fix: Wait for audio and video thread to fully stop to avoid corrupted recordings (#1836) + [0.14.0] - 2025-05-06 * [iOS/Android]feat: Media Recorder implementation Android and iOS (#1810) diff --git a/android/build.gradle b/android/build.gradle index f9b288f868..0d6571a581 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -52,7 +52,7 @@ android { } dependencies { - implementation 'io.github.webrtc-sdk:android:125.6422.03' + implementation 'io.github.webrtc-sdk:android:137.7151.01' implementation 'com.github.davidliu:audioswitch:89582c47c9a04c62f90aa5e57251af4800a62c9a' implementation 'androidx.annotation:annotation:1.1.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/android/proguard-rules.pro b/android/proguard-rules.pro index 6ce9896196..699b363c62 100644 --- a/android/proguard-rules.pro +++ b/android/proguard-rules.pro @@ -1,3 +1,4 @@ # Flutter WebRTC -keep class com.cloudwebrtc.webrtc.** { *; } -keep class org.webrtc.** { *; } +-keep class org.jni_zero.** { *; } diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/GetUserMediaImpl.java b/android/src/main/java/com/cloudwebrtc/webrtc/GetUserMediaImpl.java index 0b0998f384..75b85eda4e 100755 --- a/android/src/main/java/com/cloudwebrtc/webrtc/GetUserMediaImpl.java +++ b/android/src/main/java/com/cloudwebrtc/webrtc/GetUserMediaImpl.java @@ -969,64 +969,14 @@ void startRecordingToFile( mediaRecorders.append(id, mediaRecorder); } - void stopRecording(Integer id, String albumName) { - try { - MediaRecorderImpl mediaRecorder = mediaRecorders.get(id); - if (mediaRecorder != null) { - mediaRecorder.stopRecording(); + void stopRecording(Integer id, String albumName, Runnable onFinished) { + MediaRecorderImpl mediaRecorder = mediaRecorders.get(id); + if (mediaRecorder != null) { + mediaRecorder.stopRecording(() -> { mediaRecorders.remove(id); - File file = mediaRecorder.getRecordFile(); - Uri collection; - - if (file != null) { - ContentValues values = new ContentValues(); - values.put(MediaStore.Video.Media.TITLE, file.getName()); - values.put(MediaStore.Video.Media.DISPLAY_NAME, file.getName()); - values.put(MediaStore.Video.Media.ALBUM, albumName); - values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); - values.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000); - values.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis()); - - //Android version above 9 MediaStore uses RELATIVE_PATH - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - values.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + albumName); - values.put(MediaStore.Video.Media.IS_PENDING, 1); - - collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY); - } else { - //Android version 9 and below MediaStore uses DATA - values.put(MediaStore.Video.Media.DATA, "/storage/emulated/0/Movies/" + albumName + "/" + file.getName()); - - collection = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } - - ContentResolver resolver = applicationContext.getContentResolver(); - Uri uriSavedMedia = resolver.insert(collection, values); - - assert uriSavedMedia != null; - ParcelFileDescriptor pfd = resolver.openFileDescriptor(uriSavedMedia, "w"); - assert pfd != null; - FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor()); - - InputStream in = new FileInputStream(file); - - byte[] buf = new byte[8192]; - int len; - - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - - out.close(); - in.close(); - pfd.close(); - values.clear(); - } - } - } catch(Exception e){ - + onFinished.run(); + }); } - } diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/MethodCallHandlerImpl.java b/android/src/main/java/com/cloudwebrtc/webrtc/MethodCallHandlerImpl.java index 8444c0e66b..dfa5de8e7a 100644 --- a/android/src/main/java/com/cloudwebrtc/webrtc/MethodCallHandlerImpl.java +++ b/android/src/main/java/com/cloudwebrtc/webrtc/MethodCallHandlerImpl.java @@ -771,8 +771,7 @@ public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) { case "stopRecordToFile": Integer recorderId = call.argument("recorderId"); String albumName = call.argument("albumName"); - getUserMediaImpl.stopRecording(recorderId, albumName); - result.success(null); + getUserMediaImpl.stopRecording(recorderId, albumName, () -> result.success(null)); break; case "captureFrame": { String path = call.argument("path"); diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/OrientationAwareScreenCapturer.java b/android/src/main/java/com/cloudwebrtc/webrtc/OrientationAwareScreenCapturer.java index 13a46c4964..7bee5d0dc2 100644 --- a/android/src/main/java/com/cloudwebrtc/webrtc/OrientationAwareScreenCapturer.java +++ b/android/src/main/java/com/cloudwebrtc/webrtc/OrientationAwareScreenCapturer.java @@ -15,6 +15,7 @@ import android.view.WindowManager; import android.app.Activity; import android.hardware.display.DisplayManager; +import android.util.DisplayMetrics; import android.hardware.display.VirtualDisplay; import android.media.projection.MediaProjectionManager; import android.os.Looper; @@ -76,9 +77,11 @@ public void onFrame(VideoFrame frame) { } private boolean isDeviceOrientationPortrait() { - final int surfaceRotation = windowManager.getDefaultDisplay().getRotation(); - - return surfaceRotation != Surface.ROTATION_90 && surfaceRotation != Surface.ROTATION_270; + final Display display = windowManager.getDefaultDisplay(); + final DisplayMetrics metrics = new DisplayMetrics(); + display.getRealMetrics(metrics); + + return metrics.heightPixels > metrics.widthPixels; } diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/record/AudioFileRenderer.java b/android/src/main/java/com/cloudwebrtc/webrtc/record/AudioFileRenderer.java new file mode 100644 index 0000000000..baa4d35d72 --- /dev/null +++ b/android/src/main/java/com/cloudwebrtc/webrtc/record/AudioFileRenderer.java @@ -0,0 +1,258 @@ +package com.cloudwebrtc.webrtc.record; + +import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.media.MediaFormat; +import android.media.MediaMuxer; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; + +import org.webrtc.audio.JavaAudioDeviceModule; +import org.webrtc.audio.JavaAudioDeviceModule.SamplesReadyCallback; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +class AudioFileRenderer implements SamplesReadyCallback { + private static final String TAG = "AudioFileRenderer"; + private final HandlerThread audioThread; + private final Handler audioThreadHandler; + private ByteBuffer[] audioInputBuffers; + private ByteBuffer[] audioOutputBuffers; + + private final MediaMuxer mediaMuxer; + private MediaCodec.BufferInfo audioBufferInfo; + private int audioTrackIndex = -1; + private boolean isRunning = true; + private MediaCodec audioEncoder; + private boolean audioEncoderStarted = false; + private volatile boolean muxerStarted = false; + + AudioFileRenderer(String outputFile) throws IOException { + audioThread = new HandlerThread(TAG + "AudioThread"); + audioThread.start(); + audioThreadHandler = new Handler(audioThread.getLooper()); + + // Create a MediaMuxer for audio-only recording + mediaMuxer = new MediaMuxer(outputFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); + } + + /** + * Release all resources. All already posted audio samples will be processed first. + */ + void release() { + isRunning = false; + CountDownLatch latch = new CountDownLatch(1); + + audioThreadHandler.post(() -> { + try { + // First, stop the encoder if it's running + if (audioEncoder != null && audioEncoderStarted) { + try { + // Signal end of stream with timeout + int inputBufferIndex = audioEncoder.dequeueInputBuffer(10000); // 10ms timeout + if (inputBufferIndex >= 0) { + audioEncoder.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); + } + + // Drain remaining data + drainAudio(); + + audioEncoder.stop(); + audioEncoderStarted = false; + } catch (Exception e) { + Log.e(TAG, "Error stopping audio encoder", e); + } + } + + // Release encoder + if (audioEncoder != null) { + try { + audioEncoder.release(); + } catch (Exception e) { + Log.e(TAG, "Error releasing audio encoder", e); + } + audioEncoder = null; + } + + // Stop and release muxer only if it was properly started + try { + if (muxerStarted && audioTrackIndex != -1) { + mediaMuxer.stop(); + muxerStarted = false; + } + mediaMuxer.release(); + } catch (Exception e) { + Log.e(TAG, "Error stopping/releasing MediaMuxer", e); + } + + } catch (Exception e) { + Log.e(TAG, "Error during release", e); + } finally { + try { + audioThread.quit(); + } catch (Exception e) { + Log.e(TAG, "Error quitting audio thread", e); + } + latch.countDown(); + } + }); + + try { + // Wait for cleanup with timeout to prevent ANR + if (!latch.await(2, java.util.concurrent.TimeUnit.SECONDS)) { + Log.w(TAG, "Release timed out, proceeding anyway"); + } + } catch (InterruptedException e) { + Log.e(TAG, "Release interrupted", e); + Thread.currentThread().interrupt(); + } + } + + private long presTime = 0L; + + private void drainAudio() { + if (audioBufferInfo == null) + audioBufferInfo = new MediaCodec.BufferInfo(); + + while (isRunning && audioEncoder != null) { + int encoderStatus = audioEncoder.dequeueOutputBuffer(audioBufferInfo, 100); // 100ms timeout + if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) { + break; + } else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { + audioOutputBuffers = audioEncoder.getOutputBuffers(); + Log.w(TAG, "audio encoder output buffers changed"); + } else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { + MediaFormat newFormat = audioEncoder.getOutputFormat(); + Log.i(TAG, "audio encoder output format changed: " + newFormat); + + if (audioTrackIndex == -1) { + audioTrackIndex = mediaMuxer.addTrack(newFormat); + if (audioTrackIndex != -1 && !muxerStarted) { + mediaMuxer.start(); + muxerStarted = true; + Log.i(TAG, "MediaMuxer started for audio recording"); + } + } + if (!muxerStarted) + break; + } else if (encoderStatus < 0) { + Log.e(TAG, "unexpected result from audio encoder.dequeueOutputBuffer: " + encoderStatus); + } else { // encoderStatus >= 0 + try { + ByteBuffer encodedData = audioOutputBuffers[encoderStatus]; + if (encodedData == null) { + Log.e(TAG, "audio encoderOutputBuffer " + encoderStatus + " was null"); + break; + } + + // Adjust ByteBuffer values to match BufferInfo + encodedData.position(audioBufferInfo.offset); + encodedData.limit(audioBufferInfo.offset + audioBufferInfo.size); + + if (muxerStarted && audioTrackIndex != -1) { + mediaMuxer.writeSampleData(audioTrackIndex, encodedData, audioBufferInfo); + } + + audioEncoder.releaseOutputBuffer(encoderStatus, false); + + if ((audioBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { + Log.i(TAG, "End of audio stream reached"); + break; + } + } catch (Exception e) { + Log.e(TAG, "Error processing audio data", e); + break; + } + } + } + } + + @Override + public void onWebRtcAudioRecordSamplesReady(JavaAudioDeviceModule.AudioSamples audioSamples) { + if (!isRunning) + return; + + audioThreadHandler.post(() -> { + try { + // Check if we're still running before processing + if (!isRunning) { + return; + } + + // Initialize audio encoder if not already done + if (audioEncoder == null) { + initializeAudioEncoder(audioSamples); + } + + if (audioEncoder == null || !audioEncoderStarted) { + Log.e(TAG, "Failed to initialize audio encoder or encoder not started"); + return; + } + + // Get input buffer and write audio data + int bufferIndex = audioEncoder.dequeueInputBuffer(100); // 100ms timeout + if (bufferIndex >= 0) { + ByteBuffer buffer = audioInputBuffers[bufferIndex]; + buffer.clear(); + + byte[] data = audioSamples.getData(); + if (data.length <= buffer.remaining()) { + buffer.put(data); + + // Calculate presentation time (microseconds) + // Assuming 16-bit samples: data.length bytes / 2 bytes per sample / sample rate * 1000000 + long frameTime = (long) data.length * 1000000L / (2 * audioSamples.getSampleRate() * audioSamples.getChannelCount()); + + audioEncoder.queueInputBuffer(bufferIndex, 0, data.length, presTime, 0); + presTime += frameTime; + } else { + Log.w(TAG, "Audio data too large for buffer: " + data.length + " bytes, buffer capacity: " + buffer.remaining()); + audioEncoder.queueInputBuffer(bufferIndex, 0, 0, presTime, 0); + } + } else { + Log.w(TAG, "No input buffer available for audio data"); + } + + // Drain encoded audio data only if still running + if (isRunning) { + drainAudio(); + } + + } catch (Exception e) { + Log.e(TAG, "Error processing audio samples", e); + } + }); + } + + private void initializeAudioEncoder(JavaAudioDeviceModule.AudioSamples audioSamples) { + try { + audioEncoder = MediaCodec.createEncoderByType("audio/mp4a-latm"); + + MediaFormat format = new MediaFormat(); + format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm"); + format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, audioSamples.getChannelCount()); + format.setInteger(MediaFormat.KEY_SAMPLE_RATE, audioSamples.getSampleRate()); + format.setInteger(MediaFormat.KEY_BIT_RATE, 128 * 1024); // 128 kbps + format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC); + + Log.i(TAG, "Configuring audio encoder with format: " + format); + + audioEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); + audioEncoder.start(); + + audioInputBuffers = audioEncoder.getInputBuffers(); + audioOutputBuffers = audioEncoder.getOutputBuffers(); + audioEncoderStarted = true; + + Log.i(TAG, "Audio encoder initialized successfully"); + + } catch (IOException e) { + Log.e(TAG, "Failed to create audio encoder", e); + audioEncoder = null; + } + } +} diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/record/MediaRecorderImpl.java b/android/src/main/java/com/cloudwebrtc/webrtc/record/MediaRecorderImpl.java index f1c45357bc..634d14d1ae 100644 --- a/android/src/main/java/com/cloudwebrtc/webrtc/record/MediaRecorderImpl.java +++ b/android/src/main/java/com/cloudwebrtc/webrtc/record/MediaRecorderImpl.java @@ -8,6 +8,8 @@ import org.webrtc.VideoTrack; import java.io.File; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class MediaRecorderImpl { @@ -15,10 +17,12 @@ public class MediaRecorderImpl { private final VideoTrack videoTrack; private final AudioSamplesInterceptor audioInterceptor; private VideoFileRenderer videoFileRenderer; + private AudioFileRenderer audioFileRenderer; private boolean isRunning = false; private File recordFile; - public MediaRecorderImpl(Integer id, @Nullable VideoTrack videoTrack, @Nullable AudioSamplesInterceptor audioInterceptor) { + public MediaRecorderImpl(Integer id, @Nullable VideoTrack videoTrack, + @Nullable AudioSamplesInterceptor audioInterceptor) { this.id = id; this.videoTrack = videoTrack; this.audioInterceptor = audioInterceptor; @@ -29,36 +33,59 @@ public void startRecording(File file) throws Exception { if (isRunning) return; isRunning = true; - //noinspection ResultOfMethodCallIgnored + // noinspection ResultOfMethodCallIgnored file.getParentFile().mkdirs(); if (videoTrack != null) { videoFileRenderer = new VideoFileRenderer( - file.getAbsolutePath(), - EglUtils.getRootEglBaseContext(), - audioInterceptor != null - ); + file.getAbsolutePath(), + EglUtils.getRootEglBaseContext(), + audioInterceptor != null); videoTrack.addSink(videoFileRenderer); if (audioInterceptor != null) audioInterceptor.attachCallback(id, videoFileRenderer); } else { - Log.e(TAG, "Video track is null"); + Log.d(TAG, "Video track is null - checking for audio-only recording"); if (audioInterceptor != null) { - //TODO(rostopira): audio only recording - throw new Exception("Audio-only recording not implemented yet"); + // Audio-only recording implementation + audioFileRenderer = new AudioFileRenderer(file.getAbsolutePath()); + audioInterceptor.attachCallback(id, audioFileRenderer); + } else { + throw new Exception("Both video track and audio interceptor are null - cannot record"); } } } - public File getRecordFile() { return recordFile; } + public File getRecordFile() { + return recordFile; + } + + private final ExecutorService releaseExecutor = Executors.newSingleThreadExecutor(); - public void stopRecording() { + public void stopRecording(Runnable onStopped) { isRunning = false; if (audioInterceptor != null) audioInterceptor.detachCallback(id); if (videoTrack != null && videoFileRenderer != null) { videoTrack.removeSink(videoFileRenderer); - videoFileRenderer.release(); - videoFileRenderer = null; + releaseExecutor.submit(() -> { + videoFileRenderer.release(); + videoFileRenderer = null; + if (onStopped != null) + onStopped.run(); + releaseExecutor.shutdown(); // libera o executor + }); + } else { + if (onStopped != null) + onStopped.run(); + releaseExecutor.shutdown(); + } + if (audioFileRenderer != null) { + audioFileRenderer.release(); + audioFileRenderer = null; + } + if (audioFileRenderer != null) { + audioFileRenderer.release(); + audioFileRenderer = null; } } diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/record/VideoFileRenderer.java b/android/src/main/java/com/cloudwebrtc/webrtc/record/VideoFileRenderer.java index f2a0de795c..b1dbd08f51 100644 --- a/android/src/main/java/com/cloudwebrtc/webrtc/record/VideoFileRenderer.java +++ b/android/src/main/java/com/cloudwebrtc/webrtc/record/VideoFileRenderer.java @@ -1,3 +1,5 @@ +// Modifications by Signify, Copyright 2025, Signify Holding - SPDX-License-Identifier: MIT + package com.cloudwebrtc.webrtc.record; import android.media.MediaCodec; @@ -19,6 +21,10 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CountDownLatch; class VideoFileRenderer implements VideoSink, SamplesReadyCallback { private static final String TAG = "VideoFileRenderer"; @@ -75,31 +81,67 @@ class VideoFileRenderer implements VideoSink, SamplesReadyCallback { audioTrackIndex = withAudio ? -1 : 0; } - private void initVideoEncoder() { - MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, outputFileWidth, outputFileHeight); - - // Set some properties. Failing to specify some of these can cause the MediaCodec - // configure() call to throw an unhelpful exception. - format.setInteger(MediaFormat.KEY_COLOR_FORMAT, - MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); - format.setInteger(MediaFormat.KEY_BIT_RATE, 6000000); - format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE); - format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL); - - // Create a MediaCodec encoder, and configure it with our format. Get a Surface - // we can use for input and wrap it with a class that handles the EGL work. + private boolean tryConfigureEncoder(int width, int height) { try { + MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, width, height); + format.setInteger(MediaFormat.KEY_COLOR_FORMAT, + MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); + format.setInteger(MediaFormat.KEY_BIT_RATE, 6000000); + format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE); + format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL); + format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0); + format.setInteger(MediaFormat.KEY_PRIORITY, 0); + format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline); + encoder = MediaCodec.createEncoderByType(MIME_TYPE); encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); - renderThreadHandler.post(() -> { - eglBase = EglBase.create(sharedContext, EglBase.CONFIG_RECORDABLE); - surface = encoder.createInputSurface(); - eglBase.createSurface(surface); - eglBase.makeCurrent(); - drawer = new GlRectDrawer(); - }); + outputFileWidth = width; + outputFileHeight = height; + return true; } catch (Exception e) { - Log.wtf(TAG, e); + if (encoder != null) { + try { encoder.release(); } catch (Exception ignored) {} + encoder = null; + } + return false; + } + } + + private void initVideoEncoder(int frameWidth, int frameHeight) { + List resolutions = new ArrayList<>(); + resolutions.add(new int[]{frameWidth, frameHeight}); + resolutions.addAll(Arrays.asList( + new int[]{1920, 1080}, + new int[]{1280, 720}, + new int[]{854, 480}, + new int[]{640, 360}, + new int[]{426, 240} + )); + + for (int[] res : resolutions) { + if (tryConfigureEncoder(res[0], res[1])) { + break; + } + } + + if (encoder == null) { + Log.e(TAG, "Failed to configure encoder with any supported resolution."); + return; + } + + CountDownLatch latch = new CountDownLatch(1); + renderThreadHandler.post(() -> { + eglBase = EglBase.create(sharedContext, EglBase.CONFIG_RECORDABLE); + surface = encoder.createInputSurface(); + eglBase.createSurface(surface); + eglBase.makeCurrent(); + drawer = new GlRectDrawer(); + latch.countDown(); + }); + try { + latch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); } } @@ -107,14 +149,20 @@ private void initVideoEncoder() { public void onFrame(VideoFrame frame) { frame.retain(); if (outputFileWidth == -1) { - outputFileWidth = frame.getRotatedWidth(); - outputFileHeight = frame.getRotatedHeight(); - initVideoEncoder(); + int frameWidth = frame.getRotatedWidth(); + int frameHeight = frame.getRotatedHeight(); + initVideoEncoder(frameWidth, frameHeight); } renderThreadHandler.post(() -> renderFrameOnRenderThread(frame)); } private void renderFrameOnRenderThread(VideoFrame frame) { + if (drawer == null) { + Log.e(TAG, "drawer is null — skipping frame render"); + frame.release(); + return; + } + if (frameDrawer == null) { frameDrawer = new VideoFrameDrawer(); } @@ -127,27 +175,53 @@ private void renderFrameOnRenderThread(VideoFrame frame) { /** * Release all resources. All already posted frames will be rendered first. */ + // Start Signify modification void release() { isRunning = false; - if (audioThreadHandler != null) + CountDownLatch latch = new CountDownLatch(audioThreadHandler != null ? 2 : 1); + if (audioThreadHandler != null) { audioThreadHandler.post(() -> { - if (audioEncoder != null) { - audioEncoder.stop(); - audioEncoder.release(); + try{ + if (audioEncoder != null) { + audioEncoder.stop(); + audioEncoder.release(); + } + audioThread.quit(); + } finally { + latch.countDown(); } - audioThread.quit(); }); + } + renderThreadHandler.post(() -> { - if (encoder != null) { - encoder.stop(); - encoder.release(); + try { + if (encoder != null) { + encoder.stop(); + encoder.release(); + } + if (eglBase != null) { + eglBase.release(); + eglBase = null; + } + if (muxerStarted) { + mediaMuxer.stop(); + mediaMuxer.release(); + muxerStarted = false; + } + renderThread.quit(); + } finally { + latch.countDown(); } - eglBase.release(); - mediaMuxer.stop(); - mediaMuxer.release(); - renderThread.quit(); }); + + try { + latch.await(); + } catch (InterruptedException e) { + Log.e(TAG, "Release interrupted", e); + Thread.currentThread().interrupt(); + } } + // End Signify modification private boolean encoderStarted = false; private volatile boolean muxerStarted = false; @@ -174,7 +248,9 @@ private void drainEncoder() { Log.e(TAG, "encoder output format changed: " + newFormat); trackIndex = mediaMuxer.addTrack(newFormat); - if (audioTrackIndex != -1 && !muxerStarted) { + // Start Signify modification + if (trackIndex != -1 && audioTrackIndex != -1 && !muxerStarted) { + // End Signify modification mediaMuxer.start(); muxerStarted = true; } @@ -230,7 +306,9 @@ private void drainAudio() { Log.w(TAG, "encoder output format changed: " + newFormat); audioTrackIndex = mediaMuxer.addTrack(newFormat); - if (trackIndex != -1 && !muxerStarted) { + // Start Signify modification + if (trackIndex != -1 && audioTrackIndex != -1 && !muxerStarted) { + // End Signify modification mediaMuxer.start(); muxerStarted = true; } diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/video/camera/CameraUtils.java b/android/src/main/java/com/cloudwebrtc/webrtc/video/camera/CameraUtils.java index 04c189eeec..12802ce1d0 100644 --- a/android/src/main/java/com/cloudwebrtc/webrtc/video/camera/CameraUtils.java +++ b/android/src/main/java/com/cloudwebrtc/webrtc/video/camera/CameraUtils.java @@ -45,7 +45,14 @@ public CameraUtils(GetUserMediaImpl getUserMediaImpl, Activity activity) { this.getUserMediaImpl = getUserMediaImpl; this.activity = activity; this.deviceOrientationManager = new DeviceOrientationManager(activity, 0); - this.deviceOrientationManager.start(); + // commented out because you cannot register a reciever when the app is terminated + // because the activity is null? + // this causes the call to break if the app is terminated + // the manager seems to end up at handleOrientationChange which does not do + // anything at the moment so this should be ok + + // TODO: get a proper fix at some point + // this.deviceOrientationManager.start(); } public void setFocusMode(MethodCall call, AnyThreadResult result) { diff --git a/common/cpp/include/flutter_webrtc_base.h b/common/cpp/include/flutter_webrtc_base.h index 9edabc7680..e894978ab1 100644 --- a/common/cpp/include/flutter_webrtc_base.h +++ b/common/cpp/include/flutter_webrtc_base.h @@ -12,6 +12,7 @@ #include "libwebrtc.h" #include "rtc_audio_device.h" +#include "rtc_audio_processing.h" #include "rtc_desktop_device.h" #include "rtc_dtmf_sender.h" #include "rtc_media_stream.h" @@ -21,8 +22,6 @@ #include "rtc_peerconnection_factory.h" #include "rtc_video_device.h" -#include "uuidxx.h" - namespace flutter_webrtc_plugin { using namespace libwebrtc; @@ -46,14 +45,18 @@ class FlutterWebRTCBase { FlutterWebRTCBase(BinaryMessenger* messenger, TextureRegistrar* textures, TaskRunner* task_runner); ~FlutterWebRTCBase(); + virtual scoped_refptr audio_processing() { + return audio_processing_; + } + + virtual scoped_refptr MediaTrackForId(const std::string& id); + std::string GenerateUUID(); RTCPeerConnection* PeerConnectionForId(const std::string& id); void RemovePeerConnectionForId(const std::string& id); - RTCMediaTrack* MediaTrackForId(const std::string& id); - void RemoveMediaTrackForId(const std::string& id); FlutterPeerConnectionObserver* PeerConnectionObserversForId( @@ -104,6 +107,7 @@ class FlutterWebRTCBase { scoped_refptr audio_device_; scoped_refptr video_device_; scoped_refptr desktop_device_; + scoped_refptr audio_processing_; RTCConfiguration configuration_; std::map> peerconnections_; diff --git a/common/cpp/src/flutter_media_stream.cc b/common/cpp/src/flutter_media_stream.cc index 324dbdc4ce..3f7a7a97a9 100644 --- a/common/cpp/src/flutter_media_stream.cc +++ b/common/cpp/src/flutter_media_stream.cc @@ -288,7 +288,6 @@ void FlutterMediaStream::GetUserVideo(const EncodableMap& constraints, if (!video_capturer.get()) return; - video_capturer->StartCapture(); const char* video_source_label = "video_input"; @@ -333,10 +332,11 @@ void FlutterMediaStream::GetSources(std::unique_ptr result) { for (uint16_t i = 0; i < nb_audio_devices; i++) { base_->audio_device_->RecordingDeviceName(i, strNameUTF8, strGuidUTF8); + std::string device_id = strlen(strGuidUTF8) > 0 ? std::string(strGuidUTF8) + : std::string(strNameUTF8); EncodableMap audio; audio[EncodableValue("label")] = EncodableValue(std::string(strNameUTF8)); - audio[EncodableValue("deviceId")] = - EncodableValue(std::string(strGuidUTF8)); + audio[EncodableValue("deviceId")] = EncodableValue(device_id); audio[EncodableValue("facing")] = ""; audio[EncodableValue("kind")] = "audioinput"; sources.push_back(EncodableValue(audio)); @@ -345,10 +345,11 @@ void FlutterMediaStream::GetSources(std::unique_ptr result) { nb_audio_devices = base_->audio_device_->PlayoutDevices(); for (uint16_t i = 0; i < nb_audio_devices; i++) { base_->audio_device_->PlayoutDeviceName(i, strNameUTF8, strGuidUTF8); + std::string device_id = strlen(strGuidUTF8) > 0 ? std::string(strGuidUTF8) + : std::string(strNameUTF8); EncodableMap audio; audio[EncodableValue("label")] = EncodableValue(std::string(strNameUTF8)); - audio[EncodableValue("deviceId")] = - EncodableValue(std::string(strGuidUTF8)); + audio[EncodableValue("deviceId")] = EncodableValue(device_id); audio[EncodableValue("facing")] = ""; audio[EncodableValue("kind")] = "audiooutput"; sources.push_back(EncodableValue(audio)); @@ -373,13 +374,16 @@ void FlutterMediaStream::GetSources(std::unique_ptr result) { void FlutterMediaStream::SelectAudioOutput( const std::string& device_id, std::unique_ptr result) { - char strPlayoutName[256]; - char strPlayoutGuid[256]; + char deviceName[256]; + char deviceGuid[256]; int playout_devices = base_->audio_device_->PlayoutDevices(); bool found = false; for (uint16_t i = 0; i < playout_devices; i++) { - base_->audio_device_->PlayoutDeviceName(i, strPlayoutName, strPlayoutGuid); - if (device_id != "" && device_id == strPlayoutGuid) { + base_->audio_device_->PlayoutDeviceName(i, deviceName, deviceGuid); + std::string cur_device_id = strlen(deviceGuid) > 0 + ? std::string(deviceGuid) + : std::string(deviceName); + if (device_id != "" && device_id == cur_device_id) { base_->audio_device_->SetPlayoutDevice(i); found = true; break; @@ -395,14 +399,16 @@ void FlutterMediaStream::SelectAudioOutput( void FlutterMediaStream::SelectAudioInput( const std::string& device_id, std::unique_ptr result) { - char strPlayoutName[256]; - char strPlayoutGuid[256]; + char deviceName[256]; + char deviceGuid[256]; int playout_devices = base_->audio_device_->RecordingDevices(); bool found = false; for (uint16_t i = 0; i < playout_devices; i++) { - base_->audio_device_->RecordingDeviceName(i, strPlayoutName, - strPlayoutGuid); - if (device_id != "" && device_id == strPlayoutGuid) { + base_->audio_device_->RecordingDeviceName(i, deviceName, deviceGuid); + std::string cur_device_id = strlen(deviceGuid) > 0 + ? std::string(deviceGuid) + : std::string(deviceName); + if (device_id != "" && device_id == cur_device_id) { base_->audio_device_->SetRecordingDevice(i); found = true; break; @@ -538,14 +544,14 @@ void FlutterMediaStream::MediaStreamTrackDispose( if (track->id().std_string() == track_id) { stream->RemoveTrack(track); - if (base_->video_capturers_.find(track_id) != - base_->video_capturers_.end()) { - auto video_capture = base_->video_capturers_[track_id]; - if (video_capture->CaptureStarted()) { - video_capture->StopCapture(); + if (base_->video_capturers_.find(track_id) != + base_->video_capturers_.end()) { + auto video_capture = base_->video_capturers_[track_id]; + if (video_capture->CaptureStarted()) { + video_capture->StopCapture(); + } + base_->video_capturers_.erase(track_id); } - base_->video_capturers_.erase(track_id); - } } } } diff --git a/common/cpp/src/flutter_webrtc.cc b/common/cpp/src/flutter_webrtc.cc index a402e47ed9..5e0afb6e17 100644 --- a/common/cpp/src/flutter_webrtc.cc +++ b/common/cpp/src/flutter_webrtc.cc @@ -352,7 +352,8 @@ void FlutterWebRTC::HandleMethodCall( return; } DataChannelSend(data_channel, type, data, std::move(result)); - } else if (method_call.method_name().compare("dataChannelGetBufferedAmount") == 0) { + } else if (method_call.method_name().compare( + "dataChannelGetBufferedAmount") == 0) { if (!method_call.arguments()) { result->Error("Bad Arguments", "Null constraints arguments received"); return; diff --git a/common/cpp/src/flutter_webrtc_base.cc b/common/cpp/src/flutter_webrtc_base.cc index a8c184ba15..acd169cb2c 100644 --- a/common/cpp/src/flutter_webrtc_base.cc +++ b/common/cpp/src/flutter_webrtc_base.cc @@ -3,6 +3,8 @@ #include "flutter_data_channel.h" #include "flutter_peerconnection.h" +#include "helper.h" + namespace flutter_webrtc_plugin { const char* kEventChannelName = "FlutterWebRTC.Event"; @@ -16,6 +18,7 @@ FlutterWebRTCBase::FlutterWebRTCBase(BinaryMessenger* messenger, audio_device_ = factory_->GetAudioDevice(); video_device_ = factory_->GetVideoDevice(); desktop_device_ = factory_->GetDesktopDevice(); + audio_processing_ = factory_->GetAudioProcessing(); event_channel_ = EventChannelProxy::Create(messenger_, task_runner_, kEventChannelName); } @@ -28,7 +31,7 @@ EventChannelProxy* FlutterWebRTCBase::event_channel() { } std::string FlutterWebRTCBase::GenerateUUID() { - return uuidxx::uuid::Generate().ToString(false); + return libwebrtc::Helper::CreateRandomUuid().std_string(); } RTCPeerConnection* FlutterWebRTCBase::PeerConnectionForId( @@ -47,11 +50,11 @@ void FlutterWebRTCBase::RemovePeerConnectionForId(const std::string& id) { peerconnections_.erase(it); } -RTCMediaTrack* FlutterWebRTCBase ::MediaTrackForId(const std::string& id) { +scoped_refptr FlutterWebRTCBase ::MediaTrackForId(const std::string& id) { auto it = local_tracks_.find(id); if (it != local_tracks_.end()) - return (*it).second.get(); + return (*it).second; for (auto kv : peerconnection_observers_) { auto pco = kv.second.get(); diff --git a/common/darwin/Classes/FlutterRTCFrameCryptor.m b/common/darwin/Classes/FlutterRTCFrameCryptor.m index b75afc12aa..6196ffcf26 100644 --- a/common/darwin/Classes/FlutterRTCFrameCryptor.m +++ b/common/darwin/Classes/FlutterRTCFrameCryptor.m @@ -565,21 +565,21 @@ - (void)keyProviderDispose:(nonnull NSDictionary*)constraints result:(nonnull Fl result(@{@"result" : @"success"}); } -- (NSString*)stringFromState:(FrameCryptionState)state { +- (NSString*)stringFromState:(RTCFrameCryptorState)state { switch (state) { - case FrameCryptionStateNew: + case RTCFrameCryptorStateNew: return @"new"; - case FrameCryptionStateOk: + case RTCFrameCryptorStateOk: return @"ok"; - case FrameCryptionStateEncryptionFailed: + case RTCFrameCryptorStateEncryptionFailed: return @"encryptionFailed"; - case FrameCryptionStateDecryptionFailed: + case RTCFrameCryptorStateDecryptionFailed: return @"decryptionFailed"; - case FrameCryptionStateMissingKey: + case RTCFrameCryptorStateMissingKey: return @"missingKey"; - case FrameCryptionStateKeyRatcheted: + case RTCFrameCryptorStateKeyRatcheted: return @"keyRatcheted"; - case FrameCryptionStateInternalError: + case RTCFrameCryptorStateInternalError: return @"internalError"; default: return @"unknown"; @@ -590,7 +590,7 @@ - (NSString*)stringFromState:(FrameCryptionState)state { - (void)frameCryptor:(RTC_OBJC_TYPE(RTCFrameCryptor) *)frameCryptor didStateChangeWithParticipantId:(NSString*)participantId - withState:(FrameCryptionState)stateChanged { + withState:(RTCFrameCryptorState)stateChanged { if (frameCryptor.eventSink) { postEvent(frameCryptor.eventSink, @{ @"event" : @"frameCryptionStateChanged", diff --git a/common/darwin/Classes/FlutterRTCPeerConnection.m b/common/darwin/Classes/FlutterRTCPeerConnection.m index d37eafde10..29f2e90a94 100644 --- a/common/darwin/Classes/FlutterRTCPeerConnection.m +++ b/common/darwin/Classes/FlutterRTCPeerConnection.m @@ -843,8 +843,15 @@ - (void)transceiverSetCodecPreferences:(nonnull NSDictionary*)argsMap [codecCaps addObject:codec]; } } - [transcevier setCodecPreferences:codecCaps]; - result(nil); + NSError *error = nil; + [transcevier setCodecPreferences:codecCaps error:&error]; + if (error) { + result([FlutterError errorWithCode:@"SetCodecPreferencesError" + message:error.localizedDescription + details:nil]); + } else { + result(nil); + } } @end diff --git a/common/darwin/Classes/FlutterWebRTCPlugin.h b/common/darwin/Classes/FlutterWebRTCPlugin.h index ee39d6345f..6ca5f3dbb2 100644 --- a/common/darwin/Classes/FlutterWebRTCPlugin.h +++ b/common/darwin/Classes/FlutterWebRTCPlugin.h @@ -21,6 +21,7 @@ typedef void (^CapturerStopHandler)(CompletionHandler _Nonnull handler); @interface FlutterWebRTCPlugin : NSObject >* _Nullable localTracks; @property(nonatomic, strong) NSMutableDictionary* _Nullable renders; -@property(nonatomic, strong) NSMutableDictionary* recorders; +@property(nonatomic, strong) NSMutableDictionary* _Nonnull recorders; @property(nonatomic, strong) NSMutableDictionary* _Nullable videoCapturerStopHandlers; @@ -71,7 +72,7 @@ typedef void (^CapturerStopHandler)(CompletionHandler _Nonnull handler); peerConnectionId:(NSString* _Nullable)peerConnectionId; - (RTCMediaStreamTrack* _Nullable)trackForId:(NSString* _Nonnull)trackId peerConnectionId:(NSString* _Nullable)peerConnectionId; -- (NSString*)audioTrackIdForVideoTrackId:(NSString*)videoTrackId; +- (NSString* _Nullable)audioTrackIdForVideoTrackId:(NSString* _Nonnull)videoTrackId; - (RTCRtpTransceiver* _Nullable)getRtpTransceiverById:(RTCPeerConnection* _Nonnull)peerConnection Id:(NSString* _Nullable)Id; - (NSDictionary* _Nullable)mediaStreamToMap:(RTCMediaStream* _Nonnull)stream diff --git a/common/darwin/Classes/FlutterWebRTCPlugin.m b/common/darwin/Classes/FlutterWebRTCPlugin.m index 73f01aebe1..e7102173d3 100644 --- a/common/darwin/Classes/FlutterWebRTCPlugin.m +++ b/common/darwin/Classes/FlutterWebRTCPlugin.m @@ -195,14 +195,10 @@ - (instancetype)initWithChannel:(FlutterMethodChannel*)channel name:AVAudioSessionRouteChangeNotification object:session]; #endif -#if TARGET_OS_OSX - [_peerConnectionFactory.audioDeviceModule setDevicesUpdatedHandler:^(void) { - NSLog(@"Handle Devices Updated!"); - if (self.eventSink) { - postEvent( self.eventSink, @{@"event" : @"onDeviceChange"}); - } - }]; -#endif + + // Observe audio device module events. + _peerConnectionFactory.audioDeviceModule.observer = self; + return self; } @@ -257,7 +253,8 @@ - (void)initialize:(NSArray*)networkIgnoreMask [[VideoEncoderFactorySimulcast alloc] initWithPrimary:encoderFactory fallback:encoderFactory]; _peerConnectionFactory = - [[RTCPeerConnectionFactory alloc] initWithBypassVoiceProcessing:bypassVoiceProcessing + [[RTCPeerConnectionFactory alloc] initWithAudioDeviceModuleType:RTCAudioDeviceModuleTypeAudioEngine + bypassVoiceProcessing:bypassVoiceProcessing encoderFactory:simulcastFactory decoderFactory:decoderFactory audioProcessingModule:_audioManager.audioProcessingModule]; @@ -2379,4 +2376,14 @@ - (FlutterRTCVideoRenderer *)findRendererByTrackId:(NSString *)trackId { } return nil; } + +#pragma mark - RTCAudioDeviceModuleDelegate methods + +- (void)audioDeviceModuleDidUpdateDevices:(RTCAudioDeviceModule *)audioDeviceModule { + NSLog(@"audioDeviceModule did update devices"); + if (self.eventSink) { + postEvent( self.eventSink, @{@"event" : @"onDeviceChange"}); + } +} + @end diff --git a/elinux/CMakeLists.txt b/elinux/CMakeLists.txt index 6ae0ea6390..f642680e1e 100644 --- a/elinux/CMakeLists.txt +++ b/elinux/CMakeLists.txt @@ -2,6 +2,13 @@ cmake_minimum_required(VERSION 3.15) set(PROJECT_NAME "flutter_webrtc") project(${PROJECT_NAME} LANGUAGES CXX) +if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") + cmake_policy(SET CMP0135 NEW) +endif() + +# Add the libwebrtc dependency +include("${CMAKE_CURRENT_SOURCE_DIR}/../third_party/CMakeLists.txt") + # This value is used when generating builds using this plugin, so it must # not be changed set(PLUGIN_NAME "flutter_webrtc_plugin") @@ -11,7 +18,6 @@ add_definitions(-DRTC_DESKTOP_DEVICE) add_definitions(-DFLUTTER_ELINUX) add_library(${PLUGIN_NAME} SHARED - "../third_party/uuidxx/uuidxx.cc" "../common/cpp/src/flutter_data_channel.cc" "../common/cpp/src/flutter_frame_cryptor.cc" "../common/cpp/src/flutter_frame_capturer.cc" @@ -28,7 +34,6 @@ add_library(${PLUGIN_NAME} SHARED include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../common/cpp/include" - "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/uuidxx" "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/libwebrtc/include" "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/svpng" ) @@ -39,6 +44,7 @@ set_target_properties(${PLUGIN_NAME} PROPERTIES target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/../common/cpp/include" ) target_link_libraries(${PLUGIN_NAME} PRIVATE flutter diff --git a/example/.gitignore b/example/.gitignore index f70e6e8ce0..250ac63817 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -5,9 +5,12 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ +migrate_working_dir/ # IntelliJ related *.iml @@ -22,19 +25,23 @@ # Flutter/Dart/Pub related **/doc/api/ +**/ios/Flutter/.last_build_id .dart_tool/ .flutter-plugins .flutter-plugins-dependencies -.packages .pub-cache/ .pub/ /build/ -.metadata - -# Web related # Symbolication related app.*.symbols -# Exceptions to above rules. -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +/pubspec.lock diff --git a/example/android/.gitignore b/example/android/.gitignore index 6f568019d3..be3943c96d 100644 --- a/example/android/.gitignore +++ b/example/android/.gitignore @@ -5,9 +5,10 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +# See https://flutter.dev/to/reference-keystore key.properties **/*.keystore **/*.jks diff --git a/example/ios/.gitignore b/example/ios/.gitignore index 7a7f9873ad..a4fb6c644f 100644 --- a/example/ios/.gitignore +++ b/example/ios/.gitignore @@ -32,3 +32,5 @@ Runner/GeneratedPluginRegistrant.* !default.mode2v3 !default.pbxuser !default.perspectivev3 + +/Podfile.lock diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index d974dc02cf..63fb3d8487 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,10 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21C4A0A0C4EDAF82A00D8B64 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AE117A2B715E98F15C6AA714 /* libPods-Runner.a */; }; 331C80F4294D02FB00263BE5 /* RunnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 331C80F3294D02FB00263BE5 /* RunnerTests.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 561F5A80E4F57894D232B226 /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BB083770F6094D4927342A6 /* libPods-RunnerTests.a */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -41,11 +43,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0581965BF29AE67BDD6BDBC8 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2F289A70F4F3CAE9189F4318 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C80F1294D02FB00263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80F3294D02FB00263BE5 /* RunnerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RunnerTests.m; sourceTree = ""; }; + 35A64DA8F8FD8FFEF0D223F2 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 7501B8354B037085FF020F73 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -57,6 +63,10 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9BB083770F6094D4927342A6 /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + AE117A2B715E98F15C6AA714 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + B7283ABB02AC53C40B5DFEBD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E49E01D129BB9C508D596C64 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -64,6 +74,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 561F5A80E4F57894D232B226 /* libPods-RunnerTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -71,6 +82,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 21C4A0A0C4EDAF82A00D8B64 /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -85,6 +97,20 @@ path = RunnerTests; sourceTree = ""; }; + 7BC7F4882507197B5103CBF1 /* Pods */ = { + isa = PBXGroup; + children = ( + 0581965BF29AE67BDD6BDBC8 /* Pods-Runner.debug.xcconfig */, + 7501B8354B037085FF020F73 /* Pods-Runner.release.xcconfig */, + E49E01D129BB9C508D596C64 /* Pods-Runner.profile.xcconfig */, + 2F289A70F4F3CAE9189F4318 /* Pods-RunnerTests.debug.xcconfig */, + 35A64DA8F8FD8FFEF0D223F2 /* Pods-RunnerTests.release.xcconfig */, + B7283ABB02AC53C40B5DFEBD /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -103,6 +129,8 @@ 97C146F01CF9000F007C117D /* Runner */, 331C80F2294D02FB00263BE5 /* RunnerTests */, 97C146EF1CF9000F007C117D /* Products */, + 7BC7F4882507197B5103CBF1 /* Pods */, + E3B30162DA11C9F0FC10EA5D /* Frameworks */, ); sourceTree = ""; }; @@ -139,6 +167,15 @@ name = "Supporting Files"; sourceTree = ""; }; + E3B30162DA11C9F0FC10EA5D /* Frameworks */ = { + isa = PBXGroup; + children = ( + AE117A2B715E98F15C6AA714 /* libPods-Runner.a */, + 9BB083770F6094D4927342A6 /* libPods-RunnerTests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,6 +183,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80F7294D02FB00263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + 86EF18A6F1E0EDCAD32BFA56 /* [CP] Check Pods Manifest.lock */, 331C80ED294D02FB00263BE5 /* Sources */, 331C80EE294D02FB00263BE5 /* Frameworks */, 331C80EF294D02FB00263BE5 /* Resources */, @@ -164,12 +202,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 09FAB8CF715A50452F67A49C /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + DFD38EC3328043709D723FCC /* [CP] Copy Pods Resources */, + E22CA7B7D654F592DA4282CC /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -186,7 +227,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80F0294D02FB00263BE5 = { @@ -239,6 +280,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 09FAB8CF715A50452F67A49C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -255,6 +318,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 86EF18A6F1E0EDCAD32BFA56 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -270,6 +355,40 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + DFD38EC3328043709D723FCC /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + E22CA7B7D654F592DA4282CC /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -362,7 +481,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -383,7 +502,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample; + PRODUCT_BUNDLE_IDENTIFIER = "com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample"; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -391,12 +510,13 @@ }; 331C80F8294D02FB00263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2F289A70F4F3CAE9189F4318 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = "com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample.RunnerTests"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; @@ -404,12 +524,13 @@ }; 331C80F9294D02FB00263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 35A64DA8F8FD8FFEF0D223F2 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = "com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample.RunnerTests"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; @@ -417,12 +538,13 @@ }; 331C80FA294D02FB00263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = B7283ABB02AC53C40B5DFEBD /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = "com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample.RunnerTests"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; @@ -475,7 +597,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -524,7 +646,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -545,7 +667,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample; + PRODUCT_BUNDLE_IDENTIFIER = "com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample"; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -563,7 +685,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample; + PRODUCT_BUNDLE_IDENTIFIER = "com.cloudwebrtc.flutter-flutter-example.flutterWebrtcExample"; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index f7213505ac..d7417c13ce 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16ed..21a3cc14c7 100644 --- a/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/example/lib/main.dart b/example/lib/main.dart index 64bfc07d0c..53d6da088f 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,10 +1,7 @@ import 'dart:core'; -import 'package:flutter/foundation.dart' - show debugDefaultTargetPlatformOverride; import 'package:flutter/material.dart'; import 'package:flutter_background/flutter_background.dart'; -import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:flutter_webrtc_example/src/capture_frame_sample.dart'; import 'src/device_enumeration_sample.dart'; @@ -17,11 +14,6 @@ import 'src/route_item.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); - if (WebRTC.platformIsDesktop) { - debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; - } else if (WebRTC.platformIsAndroid) { - //startForegroundService(); - } runApp(MyApp()); } diff --git a/example/macos/.gitignore b/example/macos/.gitignore index 746adbb6b9..0a70cf5ea1 100644 --- a/example/macos/.gitignore +++ b/example/macos/.gitignore @@ -5,3 +5,5 @@ # Xcode-related **/dgph **/xcuserdata/ + +/Podfile.lock diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/example/macos/Runner.xcodeproj/project.pbxproj index e2c46d9f3f..809ab956ed 100644 --- a/example/macos/Runner.xcodeproj/project.pbxproj +++ b/example/macos/Runner.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 4FEA11646F548743A74CF884 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F84E6BB3DEB1D95AD50AD969 /* Pods_Runner.framework */; }; + E60EFA22891D643DD979D09A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DF45159536E6832DBB2AF10 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1C3E69E23559F194216F462C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -76,8 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 3DF45159536E6832DBB2AF10 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 499F14907F020AB5800848DC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 77E25E1D5007D619ED498B41 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 7A0F103C3A872AFC09BF3C20 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 9FC08AA1A7BC3B41A49B50A5 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + ECD43F0A89650285C7114ED0 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + F84E6BB3DEB1D95AD50AD969 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -85,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E60EFA22891D643DD979D09A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -92,12 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4FEA11646F548743A74CF884 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 27E22E23872DE5166316BE6B /* Pods */ = { + isa = PBXGroup; + children = ( + 7A0F103C3A872AFC09BF3C20 /* Pods-Runner.debug.xcconfig */, + 499F14907F020AB5800848DC /* Pods-Runner.release.xcconfig */, + 77E25E1D5007D619ED498B41 /* Pods-Runner.profile.xcconfig */, + 1C3E69E23559F194216F462C /* Pods-RunnerTests.debug.xcconfig */, + 9FC08AA1A7BC3B41A49B50A5 /* Pods-RunnerTests.release.xcconfig */, + ECD43F0A89650285C7114ED0 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -125,6 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + 27E22E23872DE5166316BE6B /* Pods */, ); sourceTree = ""; }; @@ -175,6 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + F84E6BB3DEB1D95AD50AD969 /* Pods_Runner.framework */, + 3DF45159536E6832DBB2AF10 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -186,6 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + ADB10355CEE869680D2A307C /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -204,11 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + D6EB234D8B4FB7DD0ADA837E /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + 0303EE9BD0286223B62FD2E5 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -227,7 +259,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { @@ -290,6 +322,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 0303EE9BD0286223B62FD2E5 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -328,6 +377,50 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + ADB10355CEE869680D2A307C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + D6EB234D8B4FB7DD0ADA837E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,6 +472,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1C3E69E23559F194216F462C /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -393,6 +487,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9FC08AA1A7BC3B41A49B50A5 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -407,6 +502,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = ECD43F0A89650285C7114ED0 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a4df20256a..b8278cb762 100644 --- a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ diff --git a/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/example/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16ed..21a3cc14c7 100644 --- a/example/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/example/macos/Runner/AppDelegate.swift b/example/macos/Runner/AppDelegate.swift index 8e02df2888..b3c1761412 100644 --- a/example/macos/Runner/AppDelegate.swift +++ b/example/macos/Runner/AppDelegate.swift @@ -6,4 +6,8 @@ class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/ios/flutter_webrtc.podspec b/ios/flutter_webrtc.podspec index 778368a8a0..5ebc220adf 100644 --- a/ios/flutter_webrtc.podspec +++ b/ios/flutter_webrtc.podspec @@ -3,7 +3,7 @@ # Pod::Spec.new do |s| s.name = 'flutter_webrtc' - s.version = '0.14.0' + s.version = '1.0.0' s.summary = 'Flutter WebRTC plugin for iOS.' s.description = <<-DESC A new flutter plugin project. @@ -15,7 +15,7 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.dependency 'WebRTC-SDK', '125.6422.07' + s.dependency 'WebRTC-SDK', '137.7151.02' s.ios.deployment_target = '13.0' s.static_framework = true s.pod_target_xcconfig = { diff --git a/lib/src/desktop_capturer.dart b/lib/src/desktop_capturer.dart index 1780cb593c..c44037cbf9 100644 --- a/lib/src/desktop_capturer.dart +++ b/lib/src/desktop_capturer.dart @@ -1,10 +1,7 @@ import 'dart:async'; import 'dart:typed_data'; -enum SourceType { - Screen, - Window, -} +enum SourceType { Screen, Window } final desktopSourceTypeToString = { SourceType.Screen: 'screen', @@ -32,7 +29,7 @@ abstract class DesktopCapturerSource { /// chromeMediaSourceId constraint when calling String get id; - /// A screen source will be named either Entire Screen or Screen , + /// A screen source will be named either Entire Screen or Screen index, /// while the name of a window source will match the window title. String get name; @@ -63,8 +60,10 @@ abstract class DesktopCapturer { throw UnimplementedError(); ///Get the screen source of the specified types - Future> getSources( - {required List types, ThumbnailSize? thumbnailSize}); + Future> getSources({ + required List types, + ThumbnailSize? thumbnailSize, + }); /// Updates the list of screen sources of the specified types Future updateSources({required List types}); diff --git a/lib/src/web/rtc_video_renderer_impl.dart b/lib/src/web/rtc_video_renderer_impl.dart index 69df097e0c..109abca3d7 100644 --- a/lib/src/web/rtc_video_renderer_impl.dart +++ b/lib/src/web/rtc_video_renderer_impl.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; import 'dart:ui_web' as web_ui; import 'package:flutter/foundation.dart'; @@ -8,6 +9,9 @@ import 'package:flutter/services.dart'; import 'package:dart_webrtc/dart_webrtc.dart'; import 'package:web/web.dart' as web; +const bool useHtmlElementView = + bool.fromEnvironment("WEBRTC_USE_HTML_ELEMENT_VIEW", defaultValue: false); + // An error code value to error name Map. // See: https://developer.mozilla.org/en-US/docs/Web/API/MediaError/code const Map _kErrorValueToErrorName = { @@ -59,6 +63,8 @@ class RTCVideoRenderer extends ValueNotifier bool _muted = false; + web.HTMLVideoElement? element; + set objectFit(String fit) { if (_objectFit == fit) return; _objectFit = fit; @@ -233,6 +239,9 @@ class RTCVideoRenderer extends ValueNotifier if (audioManager != null && !audioManager.hasChildNodes()) { audioManager.remove(); } + if (!useHtmlElementView) { + element?.remove(); + } return super.dispose(); } @@ -240,8 +249,11 @@ class RTCVideoRenderer extends ValueNotifier Future audioOutput(String deviceId) async { try { final element = _audioElement; - if (null != element) { - await element.setSinkId(deviceId).toDart; + if (null != element && + element.getProperty('setSinkId'.toJS).isDefinedAndNotNull) { + await (element.callMethod('setSinkId'.toJS, deviceId.toJS) as JSPromise) + .toDart; + return true; } } catch (e) { @@ -250,62 +262,71 @@ class RTCVideoRenderer extends ValueNotifier return false; } + web.HTMLVideoElement createElement() { + for (var s in _subscriptions) { + s.cancel(); + } + _subscriptions.clear(); + + final element = web.HTMLVideoElement() + ..autoplay = true + ..muted = true + ..controls = false + ..srcObject = _videoStream + ..id = _elementIdForVideo + ..setAttribute('playsinline', 'true'); + + _applyDefaultVideoStyles(element); + + _subscriptions.add( + element.onCanPlay.listen((dynamic _) { + _updateAllValues(element); + }), + ); + + _subscriptions.add( + element.onResize.listen((dynamic _) { + _updateAllValues(element); + onResize?.call(); + }), + ); + + // The error event fires when some form of error occurs while attempting to load or perform the media. + _subscriptions.add( + element.onError.listen((web.Event _) { + // The Event itself (_) doesn't contain info about the actual error. + // We need to look at the HTMLMediaElement.error. + // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error + final error = element.error; + print('RTCVideoRenderer: videoElement.onError, ${error.toString()}'); + throw PlatformException( + code: _kErrorValueToErrorName[error!.code]!, + message: error.message != '' ? error.message : _kDefaultErrorMessage, + details: _kErrorValueToErrorDescription[error.code], + ); + }), + ); + + _subscriptions.add( + element.onEnded.listen((dynamic _) { + // print('RTCVideoRenderer: videoElement.onEnded'); + }), + ); + + return element; + } + @override Future initialize() async { - web_ui.platformViewRegistry.registerViewFactory(viewType, (int viewId) { - for (var s in _subscriptions) { - s.cancel(); - } - _subscriptions.clear(); - - final element = web.HTMLVideoElement() - ..autoplay = true - ..muted = true - ..controls = false - ..srcObject = _videoStream - ..id = _elementIdForVideo - ..setAttribute('playsinline', 'true'); - - _applyDefaultVideoStyles(element); - - _subscriptions.add( - element.onCanPlay.listen((dynamic _) { - _updateAllValues(element); - }), - ); - - _subscriptions.add( - element.onResize.listen((dynamic _) { - _updateAllValues(element); - onResize?.call(); - }), - ); - - // The error event fires when some form of error occurs while attempting to load or perform the media. - _subscriptions.add( - element.onError.listen((web.Event _) { - // The Event itself (_) doesn't contain info about the actual error. - // We need to look at the HTMLMediaElement.error. - // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error - final error = element.error; - print('RTCVideoRenderer: videoElement.onError, ${error.toString()}'); - throw PlatformException( - code: _kErrorValueToErrorName[error!.code]!, - message: - error.message != '' ? error.message : _kDefaultErrorMessage, - details: _kErrorValueToErrorDescription[error.code], - ); - }), - ); - - _subscriptions.add( - element.onEnded.listen((dynamic _) { - // print('RTCVideoRenderer: videoElement.onEnded'); - }), - ); - - return element; - }); + bool isVisible = useHtmlElementView; + if (isVisible) { + web_ui.platformViewRegistry.registerViewFactory(viewType, (int viewId) { + return createElement(); + }, isVisible: isVisible); + } else { + final element = createElement(); + web.window.document.body!.appendChild(element); + } } void _applyDefaultVideoStyles(web.HTMLVideoElement element) { @@ -314,11 +335,17 @@ class RTCVideoRenderer extends ValueNotifier element.style.transform = 'scaleX(-1)'; } - element - ..style.objectFit = _objectFit - ..style.border = 'none' - ..style.width = '100%' - ..style.height = '100%'; + if (useHtmlElementView) { + element + ..style.objectFit = _objectFit + ..style.border = 'none' + ..style.width = '100%' + ..style.height = '100%'; + } else { + element.style.pointerEvents = "none"; + element.style.opacity = "0"; + element.style.position = "absolute"; + } } @override diff --git a/lib/src/web/rtc_video_view_impl.dart b/lib/src/web/rtc_video_view_impl.dart index 9ef8ff1461..fab26ca0b8 100644 --- a/lib/src/web/rtc_video_view_impl.dart +++ b/lib/src/web/rtc_video_view_impl.dart @@ -1,8 +1,13 @@ import 'dart:async'; +import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; +import 'dart:ui' as ui; +import 'dart:ui_web' as ui_web; import 'package:flutter/material.dart'; import 'package:dart_webrtc/dart_webrtc.dart'; +import 'package:web/web.dart' as web; import 'package:webrtc_interface/webrtc_interface.dart'; import 'rtc_video_renderer_impl.dart'; @@ -41,17 +46,97 @@ class RTCVideoViewState extends State { widget.objectFit == RTCVideoViewObjectFit.RTCVideoViewObjectFitContain ? 'contain' : 'cover'; + + videoElement = + web.document.getElementById("video_${videoRenderer.viewType}") + as web.HTMLVideoElement?; + frameCallback(0.toJS, 0.toJS); } void _onRendererListener() { if (mounted) setState(() {}); } + int? callbackID; + + void getFrame(web.HTMLVideoElement element) { + callbackID = + element.requestVideoFrameCallbackWithFallback(frameCallback.toJS); + } + + void cancelFrame(web.HTMLVideoElement element) { + if (callbackID != null) { + element.cancelVideoFrameCallbackWithFallback(callbackID!); + } + } + + void frameCallback(JSAny now, JSAny metadata) { + final web.HTMLVideoElement? element = videoElement; + if (element != null) { + // only capture frames if video is playing (optimization for RAF) + if (element.readyState > 2) { + capture().then((_) async { + getFrame(element); + }); + } else { + getFrame(element); + } + } else { + if (mounted) { + Future.delayed(Duration(milliseconds: 100)).then((_) { + frameCallback(0.toJS, 0.toJS); + }); + } + } + } + + ui.Image? capturedFrame; + num? lastFrameTime; + Future capture() async { + final element = videoElement!; + if (lastFrameTime != element.currentTime) { + lastFrameTime = element.currentTime; + try { + final ui.Image img = await ui_web.createImageFromTextureSource(element, + width: element.videoWidth, + height: element.videoHeight, + transferOwnership: true); + + if (mounted) { + setState(() { + capturedFrame?.dispose(); + capturedFrame = img; + }); + } + } on web.DOMException catch (err) { + lastFrameTime = null; + if (err.name == 'InvalidStateError') { + // We don't have enough data yet, continue on + } else { + rethrow; + } + } + } + } + @override void dispose() { if (mounted) { super.dispose(); } + capturedFrame?.dispose(); + if (videoElement != null) { + cancelFrame(videoElement!); + } + } + + Size? size; + + void updateElement() { + if (videoElement != null && size != null) { + videoElement!.width = size!.width.toInt(); + videoElement!.height = size!.height.toInt(); + } } @override @@ -65,8 +150,40 @@ class RTCVideoViewState extends State { : 'cover'; } + web.HTMLVideoElement? videoElement; + Widget buildVideoElementView() { - return HtmlElementView(viewType: videoRenderer.viewType); + if (useHtmlElementView) { + return HtmlElementView(viewType: videoRenderer.viewType); + } else { + return LayoutBuilder(builder: (context, constraints) { + if (videoElement != null && size != constraints.biggest) { + size = constraints.biggest; + updateElement(); + } + + return Stack(children: [ + if (capturedFrame != null) + Positioned.fill( + child: FittedBox( + fit: switch (widget.objectFit) { + RTCVideoViewObjectFit.RTCVideoViewObjectFitContain => + BoxFit.contain, + RTCVideoViewObjectFit.RTCVideoViewObjectFitCover => + BoxFit.cover, + }, + child: SizedBox( + width: capturedFrame!.width.toDouble(), + height: capturedFrame!.height.toDouble(), + child: CustomPaint( + willChange: true, + painter: _ImageFlipPainter( + capturedFrame!, + widget.mirror, + ))))) + ]); + }); + } } @override @@ -86,3 +203,53 @@ class RTCVideoViewState extends State { ); } } + +typedef _VideoFrameRequestCallback = JSFunction; + +extension _HTMLVideoElementRequestAnimationFrame on web.HTMLVideoElement { + int requestVideoFrameCallbackWithFallback( + _VideoFrameRequestCallback callback) { + if (hasProperty('requestVideoFrameCallback'.toJS).toDart) { + return requestVideoFrameCallback(callback); + } else { + return web.window.requestAnimationFrame((double num) { + callback.callAsFunction(this, 0.toJS, 0.toJS); + }.toJS); + } + } + + void cancelVideoFrameCallbackWithFallback(int callbackID) { + if (hasProperty('requestVideoFrameCallback'.toJS).toDart) { + cancelVideoFrameCallback(callbackID); + } else { + web.window.cancelAnimationFrame(callbackID); + } + } + + external int requestVideoFrameCallback(_VideoFrameRequestCallback callback); + external void cancelVideoFrameCallback(int callbackID); +} + +class _ImageFlipPainter extends CustomPainter { + _ImageFlipPainter(this.image, this.flip); + + final ui.Image image; + final bool flip; + + @override + void paint(Canvas canvas, Size size) { + if (flip) { + canvas.scale(-1, 1); + canvas.drawImage(image, Offset(-size.width, 0), + Paint()..filterQuality = ui.FilterQuality.high); + } else { + canvas.drawImage( + image, Offset(0, 0), Paint()..filterQuality = ui.FilterQuality.high); + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) { + return false; + } +} diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 5e968390f2..46dccedb66 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -2,6 +2,13 @@ cmake_minimum_required(VERSION 3.10) set(PROJECT_NAME "flutter_webrtc") project(${PROJECT_NAME} LANGUAGES CXX) +if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") + cmake_policy(SET CMP0135 NEW) +endif() + +# Add the libwebrtc dependency +include("${CMAKE_CURRENT_SOURCE_DIR}/../third_party/CMakeLists.txt") + set(PLUGIN_NAME "${PROJECT_NAME}_plugin") set (CMAKE_EXPORT_COMPILE_COMMANDS ON ) set(CMAKE_CXX_STANDARD 17) @@ -9,7 +16,6 @@ set(CMAKE_CXX_STANDARD 17) add_definitions(-DRTC_DESKTOP_DEVICE) add_library(${PLUGIN_NAME} SHARED - "../third_party/uuidxx/uuidxx.cc" "../common/cpp/src/flutter_data_channel.cc" "../common/cpp/src/flutter_frame_cryptor.cc" "../common/cpp/src/flutter_media_stream.cc" @@ -31,7 +37,6 @@ include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/flutter/include" "${CMAKE_CURRENT_SOURCE_DIR}/../common/cpp/include" - "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/uuidxx" "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/libwebrtc/include" "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/svpng" ) @@ -41,7 +46,10 @@ set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden) target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) target_include_directories(${PLUGIN_NAME} INTERFACE -"${CMAKE_CURRENT_SOURCE_DIR}") + "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/../common/cpp/include" + "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/libwebrtc/include" +) target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) diff --git a/linux/flutter_webrtc/flutter_web_r_t_c_plugin.h b/linux/flutter_webrtc/flutter_web_r_t_c_plugin.h index 5d88c7b76d..cee9ce7b68 100644 --- a/linux/flutter_webrtc/flutter_web_r_t_c_plugin.h +++ b/linux/flutter_webrtc/flutter_web_r_t_c_plugin.h @@ -10,6 +10,10 @@ G_BEGIN_DECLS #define FLUTTER_PLUGIN_EXPORT #endif +namespace flutter_webrtc_plugin { +class FlutterWebRTC; +} // namespace flutter_webrtc_plugin + typedef struct _FlutterWebrtcPlugin FlutterWebrtcPlugin; typedef struct { GObjectClass parent_class; @@ -20,6 +24,8 @@ FLUTTER_PLUGIN_EXPORT GType flutter_webrtc_plugin_get_type(); FLUTTER_PLUGIN_EXPORT void flutter_web_r_t_c_plugin_register_with_registrar( FlPluginRegistrar* registrar); +FLUTTER_PLUGIN_EXPORT flutter_webrtc_plugin::FlutterWebRTC* flutter_webrtc_plugin_get_shared_instance(); + G_END_DECLS #endif // PLUGINS_FLUTTER_WEBRTC_PLUGIN_CPP_H_ diff --git a/linux/flutter_webrtc_plugin.cc b/linux/flutter_webrtc_plugin.cc index 336204d55a..b2a2a847fe 100644 --- a/linux/flutter_webrtc_plugin.cc +++ b/linux/flutter_webrtc_plugin.cc @@ -5,7 +5,7 @@ #include "task_runner_linux.h" const char* kChannelName = "FlutterWebRTC.Method"; - +static flutter_webrtc_plugin::FlutterWebRTC* g_shared_instance = nullptr; //#if defined(_WINDOWS) namespace flutter_webrtc_plugin { @@ -49,6 +49,7 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin { textures_(registrar->texture_registrar()), task_runner_(std::make_unique()) { webrtc_ = std::make_unique(this); + g_shared_instance = webrtc_.get(); } // Called when a method is called on |channel_|; @@ -75,4 +76,8 @@ void flutter_web_r_t_c_plugin_register_with_registrar( static auto* plugin_registrar = new flutter::PluginRegistrar(registrar); flutter_webrtc_plugin::FlutterWebRTCPluginImpl::RegisterWithRegistrar( plugin_registrar); -} \ No newline at end of file +} + +flutter_webrtc_plugin::FlutterWebRTC* flutter_webrtc_plugin_get_shared_instance() { + return g_shared_instance; +} \ No newline at end of file diff --git a/macos/flutter_webrtc.podspec b/macos/flutter_webrtc.podspec index 7baf7ea75f..673097f0c7 100644 --- a/macos/flutter_webrtc.podspec +++ b/macos/flutter_webrtc.podspec @@ -3,7 +3,7 @@ # Pod::Spec.new do |s| s.name = 'flutter_webrtc' - s.version = '0.14.0' + s.version = '1.0.0' s.summary = 'Flutter WebRTC plugin for macOS.' s.description = <<-DESC A new flutter plugin project. @@ -15,6 +15,6 @@ A new flutter plugin project. s.source_files = ['Classes/**/*'] s.dependency 'FlutterMacOS' - s.dependency 'WebRTC-SDK', '125.6422.07' - s.osx.deployment_target = '10.14' + s.dependency 'WebRTC-SDK', '137.7151.02' + s.osx.deployment_target = '10.15' end diff --git a/pubspec.yaml b/pubspec.yaml index e3e380b6f5..3fa077509b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_webrtc -description: Flutter WebRTC plugin for iOS/Android/Destkop/Web, based on GoogleWebRTC. -version: 0.14.0 +description: Flutter WebRTC plugin for iOS/Android/Desktop/Web, based on GoogleWebRTC. +version: 1.0.0 homepage: https://github.com/cloudwebrtc/flutter-webrtc environment: sdk: ">=3.3.0 <4.0.0" @@ -8,7 +8,7 @@ environment: dependencies: collection: ^1.17.0 - dart_webrtc: ^1.5.3+hotfix.2 + dart_webrtc: ^1.5.3+hotfix.3 flutter: sdk: flutter path_provider: ^2.0.2 diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt new file mode 100644 index 0000000000..5afd943325 --- /dev/null +++ b/third_party/CMakeLists.txt @@ -0,0 +1,25 @@ +include(ExternalProject) + +set(ZIPFILE "${CMAKE_CURRENT_LIST_DIR}/downloads/libwebrtc.zip") +set(DOWNLOAD_URL "https://github.com/flutter-webrtc/flutter-webrtc/releases/download/v1.0.0/libwebrtc.zip") + +if(NOT EXISTS "${ZIPFILE}") + message(NOTICE "download: ${DOWNLOAD_URL}") + file(DOWNLOAD "${DOWNLOAD_URL}" + ${ZIPFILE} + STATUS download_status + LOG download_log) + + if(NOT download_status EQUAL 0) + message(FATAL_ERROR "Failed to download dependency: ${download_log}") + endif() + + file(ARCHIVE_EXTRACT INPUT ${ZIPFILE} DESTINATION "${CMAKE_CURRENT_LIST_DIR}") +else() + if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/libwebrtc") + message(NOTICE "libwebrtc directory does not exist after extraction.") + file(ARCHIVE_EXTRACT INPUT ${ZIPFILE} DESTINATION "${CMAKE_CURRENT_LIST_DIR}") + endif() + message(TRACE "libwebrtc already downloaded.") +endif() + diff --git a/third_party/libwebrtc/include/base/atomicops.h b/third_party/libwebrtc/include/base/atomicops.h deleted file mode 100644 index 4a3b79916a..0000000000 --- a/third_party/libwebrtc/include/base/atomicops.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2011 The WebRTC Project Authors. All rights reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef LIB_WEBRTC_ATOMICOPS_H_ -#define LIB_WEBRTC_ATOMICOPS_H_ - -#if defined(WIN32) || defined(_WINDOWS) -// Include winsock2.h before including to maintain consistency with -// win32.h. We can't include win32.h directly here since it pulls in -// headers such as basictypes.h which causes problems in Chromium where webrtc -// exists as two separate projects, webrtc and libjingle. -#include -#endif // defined(WIN32) - -namespace libwebrtc { -class AtomicOps { - public: -#if defined(WIN32) || defined(_WINDOWS) - // Assumes sizeof(int) == sizeof(LONG), which it is on Win32 and Win64. - static int Increment(volatile int* i) { - return ::InterlockedIncrement(reinterpret_cast(i)); - } - static int Decrement(volatile int* i) { - return ::InterlockedDecrement(reinterpret_cast(i)); - } - static int AcquireLoad(volatile const int* i) { return *i; } - static void ReleaseStore(volatile int* i, int value) { *i = value; } - static int CompareAndSwap(volatile int* i, int old_value, int new_value) { - return ::InterlockedCompareExchange(reinterpret_cast(i), - new_value, old_value); - } - // Pointer variants. - template - static T* AcquireLoadPtr(T* volatile* ptr) { - return *ptr; - } - template - static T* CompareAndSwapPtr(T* volatile* ptr, T* old_value, T* new_value) { - return static_cast(::InterlockedCompareExchangePointer( - reinterpret_cast(ptr), new_value, old_value)); - } -#else - static int Increment(volatile int* i) { return __sync_add_and_fetch(i, 1); } - static int Decrement(volatile int* i) { return __sync_sub_and_fetch(i, 1); } - static int AcquireLoad(volatile const int* i) { - return __atomic_load_n(i, __ATOMIC_ACQUIRE); - } - static void ReleaseStore(volatile int* i, int value) { - __atomic_store_n(i, value, __ATOMIC_RELEASE); - } - static int CompareAndSwap(volatile int* i, int old_value, int new_value) { - return __sync_val_compare_and_swap(i, old_value, new_value); - } - // Pointer variants. - template - static T* AcquireLoadPtr(T* volatile* ptr) { - return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); - } - template - static T* CompareAndSwapPtr(T* volatile* ptr, T* old_value, T* new_value) { - return __sync_val_compare_and_swap(ptr, old_value, new_value); - } -#endif -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_ATOMICOPS_H_ diff --git a/third_party/libwebrtc/include/base/fixed_size_function.h b/third_party/libwebrtc/include/base/fixed_size_function.h deleted file mode 100644 index 1070b45232..0000000000 --- a/third_party/libwebrtc/include/base/fixed_size_function.h +++ /dev/null @@ -1,296 +0,0 @@ -// -// Copyright (c) 2014-2016 Pavel Medvedev. All rights reserved. -// -// Distributed under the MIT software license, see the accompanying -// file LICENSE - -#ifndef FIXED_SIZE_FUNCTION_HPP_INCLUDED -#define FIXED_SIZE_FUNCTION_HPP_INCLUDED - -#include -#include -#include -#include - -enum class construct_type { - none, - copy, - move, - copy_and_move, -}; - -namespace details { - -// V-table implementation -template -struct fixed_function_vtable_base { - Ret (*call)(void*, Args&&...) = nullptr; - void (*destroy)(void*) = nullptr; -}; - -template -struct fixed_function_vtable; - -template -struct fixed_function_vtable - : fixed_function_vtable_base {}; - -template -struct fixed_function_vtable - : fixed_function_vtable_base { - void (*copy)(const void*, void*) = nullptr; -}; - -template -struct fixed_function_vtable - : fixed_function_vtable_base { - void (*move)(void*, void*) = nullptr; -}; - -template -struct fixed_function_vtable - : fixed_function_vtable_base { - void (*copy)(const void*, void*) = nullptr; - void (*move)(void*, void*) = nullptr; -}; - -} // namespace details - -template -class fixed_size_function; - -template -class fixed_size_function { - public: - // Compile-time information - - using is_copyable = - std::integral_constant; - using is_movable = - std::integral_constant; - - using result_type = Ret; - - static const std::size_t arity = sizeof...(Args); - - template - struct argument { - static_assert(N < arity, "invalid argument index"); - using type = typename std::tuple_element>::type; - }; - - public: - template - fixed_size_function(fixed_size_function const&) = delete; - template - fixed_size_function(fixed_size_function&) = delete; - template - fixed_size_function(fixed_size_function&&) = delete; - template - fixed_size_function& operator=(fixed_size_function const&) = delete; - template - fixed_size_function& operator=(fixed_size_function&) = delete; - template - fixed_size_function& operator=(fixed_size_function&&) = delete; - template - void assign(fixed_size_function const&) = delete; - template - void assign(fixed_size_function&) = delete; - template - void assign(fixed_size_function&&) = delete; - - fixed_size_function() {} - - ~fixed_size_function() { reset(); } - - fixed_size_function(std::nullptr_t) {} - - fixed_size_function& operator=(std::nullptr_t) { - reset(); - return *this; - } - - fixed_size_function(fixed_size_function const& src) { copy(src); } - - fixed_size_function& operator=(fixed_size_function const& src) { - assign(src); - return *this; - } - - fixed_size_function(fixed_size_function& src) { copy(src); } - - fixed_size_function& operator=(fixed_size_function& src) { - assign(src); - return *this; - } - - fixed_size_function(fixed_size_function&& src) { - move(std::move(src), is_movable()); - } - - fixed_size_function& operator=(fixed_size_function&& src) { - assign(std::move(src)); - return *this; - } - - template - fixed_size_function(Functor&& f) { - create(std::forward(f)); - } - - template - fixed_size_function& operator=(Functor&& f) { - assign(std::forward(f)); - return *this; - } - - void assign(fixed_size_function const& src) { - reset(); - copy(src); - } - - void assign(fixed_size_function& src) { - reset(); - copy(src); - } - - void assign(fixed_size_function&& src) { - reset(); - move(std::move(src), is_movable()); - } - - template - void assign(Functor&& f) { - reset(); - create(std::forward(f)); - } - - void reset() { - auto destroy = vtable_.destroy; - if (destroy) { - vtable_ = vtable(); - destroy(&storage_); - } - } - - explicit operator bool() const { return vtable_.call != nullptr; } - - Ret operator()(Args... args) { - return vtable_.call ? vtable_.call(&storage_, std::forward(args)...) - : (Ret) nullptr; - } - - void swap(fixed_size_function& other) { - fixed_size_function tmp = std::move(other); - other = std::move(*this); - *this = std::move(tmp); - } - - friend void swap(fixed_size_function& lhs, fixed_size_function& rhs) { - lhs.swap(rhs); - } - - friend bool operator==(std::nullptr_t, fixed_size_function const& f) { - return !f; - } - - friend bool operator==(fixed_size_function const& f, std::nullptr_t) { - return !f; - } - - friend bool operator!=(std::nullptr_t, fixed_size_function const& f) { - return f; - } - - friend bool operator!=(fixed_size_function const& f, std::nullptr_t) { - return f; - } - - private: - template - void create(Functor&& f) { - using functor_type = typename std::decay::type; - static_assert(sizeof(functor_type) <= StorageSize, - "Functor must be smaller than storage buffer"); - - new (&storage_) functor_type(std::forward(f)); - - vtable_.call = &call_impl; - vtable_.destroy = &destroy_impl; - init_copy(is_copyable()); - init_move(is_movable()); - } - - void copy(fixed_size_function const& src) { - if (src.vtable_.copy) { - src.vtable_.copy(&src.storage_, &storage_); - vtable_ = src.vtable_; - } - } - - void move(fixed_size_function&& src, std::true_type movable) { - if (src.vtable_.move) { - src.vtable_.move(&src.storage_, &storage_); - vtable_ = src.vtable_; - src.reset(); - } - } - - void move(fixed_size_function const& src, std::false_type movable) { - copy(src); - } - - private: - template - static Ret call_impl(void* functor, Args&&... args) { - return (*static_cast(functor))(std::forward(args)...); - } - - template - static void destroy_impl(void* functor) { - static_cast(functor)->~Functor(); - } - - template - static void copy_impl(void const* functor, void* dest) { - new (dest) Functor(*static_cast(functor)); - } - - template - static void move_impl(void* functor, void* dest) { - new (dest) Functor(std::move(*static_cast(functor))); - } - - template - void init_copy(std::true_type /*copyable*/) { - vtable_.copy = ©_impl; - } - - template - void init_copy(std::false_type /*copyable*/) {} - - template - void init_move(std::true_type /*movable*/) { - vtable_.move = &move_impl; - } - - template - void init_move(std::false_type /*movable*/) {} - - private: - using vtable = - details::fixed_function_vtable; - static const size_t StorageSize = MaxSize - sizeof(vtable); - using storage = typename std::aligned_storage::type; - - vtable vtable_; - storage storage_; -}; - -#endif // FIXED_SIZE_FUNCTION_HPP_INCLUDED \ No newline at end of file diff --git a/third_party/libwebrtc/include/base/portable.h b/third_party/libwebrtc/include/base/portable.h deleted file mode 100644 index b403af9cd3..0000000000 --- a/third_party/libwebrtc/include/base/portable.h +++ /dev/null @@ -1,439 +0,0 @@ -#ifndef INFINISPAN_HOTROD_PORTABLE_H -#define INFINISPAN_HOTROD_PORTABLE_H - -#ifdef LIB_WEBRTC_API_EXPORTS -#define LIB_PORTABLE_API __declspec(dllexport) -#elif defined(LIB_WEBRTC_API_DLL) -#define LIB_PORTABLE_API __declspec(dllimport) -#elif !defined(WIN32) -#define LIB_PORTABLE_API __attribute__((visibility("default"))) -#else -#define LIB_PORTABLE_API -#endif - -#include -#include -#include -#include -#include - -/** - * This file defines structures that can be passed across shared library/DLL - * boundary. - * - * Besides memory layout, the class must be destroyed in the same library as - * created. None of these classes is thread-safe. The classes are not optimized - * for performance. - */ - -namespace portable { - -#ifdef _MSC_VER -#define strncpy_safe strncpy_s -#else -#ifndef _TRUNCATE -#define _TRUNCATE ((size_t)-1) -#endif // _TRUNCATE -#endif - -#define PORTABLE_STRING_BUF_SIZE 48 - -class string { - private: - char m_buf[PORTABLE_STRING_BUF_SIZE]; - char* m_dynamic; - size_t m_length; - - public: - LIB_PORTABLE_API string(); - LIB_PORTABLE_API void init(const char* str, size_t len); - LIB_PORTABLE_API void destroy(); - - inline string(const char* str) { init(str, strlen(str)); } - - inline string(const std::string& str) { init(str.c_str(), str.length()); } - - inline string(const string& o) { - init(o.m_dynamic == 0 ? o.m_buf : o.m_dynamic, o.m_length); - } - - inline string& operator=(const string& o) { - destroy(); - init(o.m_dynamic == 0 ? o.m_buf : o.m_dynamic, o.m_length); - return *this; - } - - LIB_PORTABLE_API ~string(); - - inline string& operator=(const std::string& str) { - destroy(); - init(str.c_str(), str.length()); - return *this; - } - - inline size_t size() { return m_length; } - - inline const char* c_string() const { - return m_dynamic == 0 ? m_buf : m_dynamic; - } - - inline std::string std_string() const { - return std::string(m_dynamic == 0 ? m_buf : m_dynamic, m_length); - } -}; - -inline std::string to_std_string(const string& str) { return str.std_string(); } - -template -class identity { - T operator()(const T& x) { return x; } -}; - -template -class vector { - protected: - using raw_type = typename std::aligned_storage::type; - - private: - T* m_array; - size_t m_size; - - public: - class move_ref { - friend class vector; - - private: - vector& m_ref; - move_ref(vector& ref) : m_ref(ref) {} - }; - - vector() : m_array(0), m_size(0) {} - vector(T* array, size_t s) : m_array(array), m_size(s) {} - - template - vector(const Iterable& v) { - m_size = v.size(); - if (v.size() == 0) { - m_array = 0; - } else { - m_array = new T[v.size()]; - size_t i = 0; - for (typename Iterable::const_iterator it = v.begin(); it != v.end(); - ++it) { - m_array[i++] = *it; - } - } - } - - template - vector(const Iterable& v, Converter convert) { - m_size = v.size(); - if (v.size() == 0) { - m_array = 0; - } else { - m_array = new T[v.size()]; - size_t i = 0; - for (typename Iterable::const_iterator it = v.begin(); it != v.end(); - ++it) { - m_array[i++] = convert(*it); - } - } - } - - vector(const vector& o) { - m_size = o.m_size; - if (m_size != 0) { - m_array = new T[o.m_size]; - for (size_t i = 0; i < o.m_size; ++i) { - m_array[i] = o.m_array[i]; - } - } - } - - ~vector() { destroy_all(); } - - vector& operator=(const vector& o) { - if (m_size < o.m_size) { - destroy_all(); - m_array = new T[o.m_size]; - } else if (o.m_size == 0 && m_size != 0) { - destroy_all(); - } - m_size = o.m_size; - for (size_t i = 0; i < o.m_size; ++i) { - m_array[i] = o.m_array[i]; - } - return *this; - } - - vector(move_ref mr) : m_array(mr.m_ref.m_array), m_size(mr.m_ref.m_size) {} - vector& operator=(move_ref mr) { - if (m_size != 0) { - destroy_all(); - } - m_size = mr.m_ref.m_size; - m_array = mr.m_ref.m_array; - mr.m_ref.m_size = 0; - mr.m_ref.m_array = 0; - return *this; - } - /** - * Not really safe - can't be used as vector(something).move(), - * but vector tmp(something); other = tmp.move(); - */ - move_ref move() { return move_ref(*this); } - - std::vector std_vector() const { - std::vector v; - v.reserve(m_size); - for (size_t i = 0; i < m_size; ++i) { - v.push_back(m_array[i]); - } - return v; - } - - const T* data() const { return m_array; } - - size_t size() const { return m_size; } - - T& operator[](size_t i) { return m_array[i]; } - - const T& operator[](size_t i) const { return m_array[i]; } - - void clear() { destroy_all(); } - - protected: - void destroy(T* rt) { reinterpret_cast(rt)->~T(); } - - void destroy_all() { - for (size_t i = 0; i < m_size; ++i) { - destroy(&m_array[i]); - } - m_size = 0; - } -}; - -template -class pair { - public: - K key; - V value; -}; - -template -class map { - private: - typedef pair my_pair; - - vector m_vec; - - /*template - static pair *to_array(const std::map &m, - K (*convertKey)(const K2 &), - V (*convertValue)(const V2 &)) - { - my_pair *data = new my_pair[m.size()]; - my_pair *dp = data; - for (std::map::const_iterator it = m.begin(); it != m.end(); ++it) - { dp->key = convertKey(it->first); dp->value = convertValue(it->second); - ++dp; - } - return data; - }*/ - - template - static my_pair* to_array(const std::map& m, KC convertKey, - VC convertValue) { - my_pair* data = new my_pair[m.size()]; - my_pair* dp = data; - for (typename std::map::const_iterator it = m.begin(); - it != m.end(); ++it) { - dp->key = convertKey(it->first); - dp->value = convertValue(it->second); - ++dp; - } - return data; - } - - public: - class move_ref { - friend class map; - - private: - map& m_ref; - move_ref(map& ref) : m_ref(ref) {} - }; - - map() {} - - /* template map(const std::map &m, - K (*convertKey)(const K2 &) = identity, - V (*convertValue)(const V2 &) = identity): - m_vec(to_array(m, convertKey, convertValue), m.size()) {}*/ - - map(const std::map& m) - : m_vec(to_array(m, identity(), identity()), m.size()) {} - - template - map(const std::map& m, KC convertKey = identity(), - VC convertValue = identity()) - : m_vec(to_array(m, convertKey, convertValue), m.size()) {} - - map(const map& o) { m_vec = o.m_vec; } - - map& operator=(const map& o) { - m_vec = o.m_vec; - return *this; - } - - map(move_ref mr) : m_vec(mr.m_ref.m_vec.move()) {} - map& operator=(move_ref mr) { - m_vec = mr.m_ref.m_vec.move(); - return *this; - } - move_ref move() { return move_ref(*this); } - - std::map std_map() const { - std::map m; - for (size_t i = 0; i < m_vec.size(); ++i) { - const my_pair* dp = m_vec.data() + i; - m[dp->key] = dp->value; - } - return m; - } - - template - std::map std_map(KC convertKey, VC convertValue) const { - std::map m; - for (size_t i = 0; i < m_vec.size(); ++i) { - const my_pair* dp = m_vec.data() + i; - m[convertKey(dp->key)] = convertValue(dp->value); - } - return m; - } - - template - const my_pair* get(K2 key, int (*cmp)(K2, const K&)) const { - for (size_t i = 0; i < m_vec.size(); ++i) { - const my_pair* dp = m_vec.data() + i; - if (!cmp(key, dp->key)) return dp; - } - return 0; - } - - const my_pair* data() const { return m_vec.data(); } - - size_t size() const { return m_vec.size(); } -}; - -/* Invasive reference counting */ -template -class counting_ptr; - -class counted_object { - template - friend class counting_ptr; - - private: - int m_counter; - - public: - counted_object() : m_counter(0) {} - virtual ~counted_object() {} -}; - -template -class counted_wrapper : public counted_object { - private: - T m_object; - - public: - counted_wrapper(const T& o) : m_object(o) {} - T& operator()() { return m_object; } -}; - -template -class counting_ptr { - public: - typedef void (*destroy)(T*); - - private: - counted_object* m_ptr; - destroy m_destroy; - - inline void dec_and_destroy() { - if (m_ptr != 0 && --(m_ptr->m_counter) == 0) { - if (m_destroy == 0) { - delete m_ptr; - } else { - m_destroy((T*)m_ptr); - } - } - } - - public: - counting_ptr() : m_ptr(0), m_destroy(0) {} - counting_ptr(T* obj, destroy d = 0) : m_ptr(obj), m_destroy(d) { - counted_object* rc = obj; // no cast required - if (rc != 0) { - rc->m_counter++; - } - } - ~counting_ptr() { dec_and_destroy(); } - counting_ptr(const counting_ptr& o) : m_ptr(o.m_ptr), m_destroy(o.m_destroy) { - if (m_ptr != 0) { - m_ptr->m_counter++; - } - } - counting_ptr& operator=(const counting_ptr& o) { - dec_and_destroy(); - m_ptr = o.m_ptr; - m_destroy = o.m_destroy; - if (m_ptr != 0) { - m_ptr->m_counter++; - } - return *this; - } - counting_ptr& operator=(T* rc) { return reset(rc, 0); } - counting_ptr& reset(T* rc, destroy d) { - dec_and_destroy(); - m_ptr = rc; - m_destroy = d; - if (rc != 0) { - rc->m_counter++; - } - return *this; - } - T* get() { return (T*)m_ptr; } - const T* get() const { return (T*)m_ptr; } - T* operator->() { return (T*)m_ptr; } - const T* operator->() const { return (const T*)m_ptr; } -}; - -template -class local_ptr { - private: - typedef void (*destroy)(T*); - T* m_ptr; - destroy m_destroy; - - public: - local_ptr() : m_ptr(0), m_destroy(0) {} - local_ptr(const local_ptr&) - : m_ptr(0), m_destroy(0) {} // copying does not persist value - local_ptr& operator=(const local_ptr&) { return *this; } - ~local_ptr() { - if (m_ptr) m_destroy(m_ptr); - } - const T* get() const { return m_ptr; } - T* get() { return m_ptr; } - void set(T* ptr, void (*dtor)(T*)) { - if (m_ptr) m_destroy(m_ptr); - m_ptr = ptr; - m_destroy = dtor; - } -}; - -} // namespace portable - -#endif // INFINISPAN_HOTROD_PORTABLE_H \ No newline at end of file diff --git a/third_party/libwebrtc/include/base/refcount.h b/third_party/libwebrtc/include/base/refcount.h deleted file mode 100644 index 6e3360e87b..0000000000 --- a/third_party/libwebrtc/include/base/refcount.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 The WebRTC Project Authors. All rights reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ -#ifndef LIB_WEBRTC_REFCOUNT_H_ -#define LIB_WEBRTC_REFCOUNT_H_ - -#include "refcountedobject.h" - -namespace libwebrtc { - -// Reference count interface. -class RefCountInterface { - public: - virtual int AddRef() const = 0; - virtual int Release() const = 0; - - protected: - virtual ~RefCountInterface() {} -}; - -} // namespace libwebrtc - -#endif // WEBRTC_BASE_REFCOUNT_H_ diff --git a/third_party/libwebrtc/include/base/refcountedobject.h b/third_party/libwebrtc/include/base/refcountedobject.h deleted file mode 100644 index 9beea333f2..0000000000 --- a/third_party/libwebrtc/include/base/refcountedobject.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2016 The WebRTC Project Authors. All rights reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ -#ifndef LIB_WEBRTC_REFCOUNTEDOBJECT_H_ -#define LIB_WEBRTC_REFCOUNTEDOBJECT_H_ - -#include - -#include "atomicops.h" - -namespace libwebrtc { - -template -class RefCountedObject : public T { - public: - RefCountedObject() {} - - template - explicit RefCountedObject(P0&& p0) : T(std::forward(p0)) {} - - template - RefCountedObject(P0&& p0, P1&& p1, Args&&... args) - : T(std::forward(p0), std::forward(p1), - std::forward(args)...) {} - - virtual int AddRef() const { return AtomicOps::Increment(&ref_count_); } - - virtual int Release() const { - int count = AtomicOps::Decrement(&ref_count_); - if (!count) { - delete this; - } - return count; - } - - // Return whether the reference count is one. If the reference count is used - // in the conventional way, a reference count of 1 implies that the current - // thread owns the reference and no other thread shares it. This call - // performs the test for a reference count of one, and performs the memory - // barrier needed for the owning thread to act on the object, knowing that it - // has exclusive access to the object. - virtual bool HasOneRef() const { - return AtomicOps::AcquireLoad(&ref_count_) == 1; - } - - protected: - virtual ~RefCountedObject() {} - - mutable volatile int ref_count_ = 0; -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_REFCOUNTEDOBJECT_H_ diff --git a/third_party/libwebrtc/include/base/scoped_ref_ptr.h b/third_party/libwebrtc/include/base/scoped_ref_ptr.h deleted file mode 100644 index 9f00839cbe..0000000000 --- a/third_party/libwebrtc/include/base/scoped_ref_ptr.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2011 The WebRTC Project Authors. All rights reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -// Originally these classes are from Chromium. -// http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/ref_counted.h?view=markup - -// -// A smart pointer class for reference counted objects. Use this class instead -// of calling AddRef and Release manually on a reference counted object to -// avoid common memory leaks caused by forgetting to Release an object -// reference. Sample usage: -// -// class MyFoo : public RefCounted { -// ... -// }; -// -// void some_function() { -// scoped_refptr foo = new MyFoo(); -// foo->Method(param); -// // |foo| is released when this function returns -// } -// -// void some_other_function() { -// scoped_refptr foo = new MyFoo(); -// ... -// foo = NULL; // explicitly releases |foo| -// ... -// if (foo) -// foo->Method(param); -// } -// -// The above examples show how scoped_refptr acts like a pointer to T. -// Given two scoped_refptr classes, it is also possible to exchange -// references between the two objects, like so: -// -// { -// scoped_refptr a = new MyFoo(); -// scoped_refptr b; -// -// b.swap(a); -// // now, |b| references the MyFoo object, and |a| references NULL. -// } -// -// To make both |a| and |b| in the above example reference the same MyFoo -// object, simply use the assignment operator: -// -// { -// scoped_refptr a = new MyFoo(); -// scoped_refptr b; -// -// b = a; -// // now, |a| and |b| each own a reference to the same MyFoo object. -// } -// - -#ifndef LIB_WEBRTC_SCOPED_REF_PTR_H_ -#define LIB_WEBRTC_SCOPED_REF_PTR_H_ - -#include - -namespace libwebrtc { - -template -class scoped_refptr { - public: - scoped_refptr() : ptr_(NULL) {} - - scoped_refptr(T* p) : ptr_(p) { - if (ptr_) ptr_->AddRef(); - } - - scoped_refptr(const scoped_refptr& r) : ptr_(r.ptr_) { - if (ptr_) ptr_->AddRef(); - } - - template - scoped_refptr(const scoped_refptr& r) : ptr_(r.get()) { - if (ptr_) ptr_->AddRef(); - } - - // Move constructors. - scoped_refptr(scoped_refptr&& r) : ptr_(r.release()) {} - - template - scoped_refptr(scoped_refptr&& r) : ptr_(r.release()) {} - - ~scoped_refptr() { - if (ptr_) ptr_->Release(); - } - - T* get() const { return ptr_; } - operator T*() const { return ptr_; } - T* operator->() const { return ptr_; } - - // Release a pointer. - // The return value is the current pointer held by this object. - // If this object holds a NULL pointer, the return value is NULL. - // After this operation, this object will hold a NULL pointer, - // and will not own the object any more. - T* release() { - T* retVal = ptr_; - ptr_ = NULL; - return retVal; - } - - scoped_refptr& operator=(T* p) { - // AddRef first so that self assignment should work - if (p) p->AddRef(); - if (ptr_) ptr_->Release(); - ptr_ = p; - return *this; - } - - scoped_refptr& operator=(const scoped_refptr& r) { - return *this = r.ptr_; - } - - template - scoped_refptr& operator=(const scoped_refptr& r) { - return *this = r.get(); - } - - scoped_refptr& operator=(scoped_refptr&& r) { - scoped_refptr(std::move(r)).swap(*this); - return *this; - } - - template - scoped_refptr& operator=(scoped_refptr&& r) { - scoped_refptr(std::move(r)).swap(*this); - return *this; - } - - void swap(T** pp) { - T* p = ptr_; - ptr_ = *pp; - *pp = p; - } - - void swap(scoped_refptr& r) { swap(&r.ptr_); } - - protected: - T* ptr_; -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_SCOPED_REF_PTR_H_ diff --git a/third_party/libwebrtc/include/helper.h b/third_party/libwebrtc/include/helper.h deleted file mode 100644 index aa467afa91..0000000000 --- a/third_party/libwebrtc/include/helper.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef HELPER_HXX -#define HELPER_HXX - -#include "rtc_types.h" - -namespace libwebrtc { -/** - * @brief A helper class with static methods for generating random UUIDs. - * - */ -class Helper { - public: - /** - * @brief Generates a random UUID string. - * - * @return The generated UUID string. - */ - LIB_WEBRTC_API static string CreateRandomUuid(); -}; -} // namespace libwebrtc - -#endif // HELPER_HXX diff --git a/third_party/libwebrtc/include/libwebrtc.h b/third_party/libwebrtc/include/libwebrtc.h deleted file mode 100644 index f17af394c0..0000000000 --- a/third_party/libwebrtc/include/libwebrtc.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef LIB_WEBRTC_HXX -#define LIB_WEBRTC_HXX - -#include "rtc_peerconnection_factory.h" -#include "rtc_types.h" - -namespace libwebrtc { - -/** - * @class LibWebRTC - * @brief Provides static methods for initializing, creating and terminating - * the WebRTC PeerConnectionFactory and threads. - * - * This class provides static methods for initializing, creating and terminating - * the WebRTC PeerConnectionFactory and threads. These methods are thread-safe - * and can be called from any thread. This class is not meant to be - * instantiated. - * - */ -class LibWebRTC { - public: - /** - * @brief Initializes the WebRTC PeerConnectionFactory and threads. - * - * Initializes the WebRTC PeerConnectionFactory and threads. This method is - * thread-safe and can be called from any thread. It initializes SSL and - * creates three threads: worker_thread, signaling_thread and network_thread. - * - * @return true if initialization is successful, false otherwise. - */ - LIB_WEBRTC_API static bool Initialize(); - - /** - * @brief Creates a new WebRTC PeerConnectionFactory. - * - * Creates a new WebRTC PeerConnectionFactory. This method is thread-safe and - * can be called from any thread. It creates a new instance of the - * RTCPeerConnectionFactoryImpl class and initializes it. - * - * @return A scoped_refptr object that points to the newly created - * RTCPeerConnectionFactory. - */ - LIB_WEBRTC_API static scoped_refptr - CreateRTCPeerConnectionFactory(); - - /** - * @brief Terminates the WebRTC PeerConnectionFactory and threads. - * - * Terminates the WebRTC PeerConnectionFactory and threads. This method is - * thread-safe and can be called from any thread. It cleans up SSL and stops - * and destroys the three threads: worker_thread, signaling_thread and - * network_thread. - * - */ - LIB_WEBRTC_API static void Terminate(); -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_HXX diff --git a/third_party/libwebrtc/include/rtc_audio_device.h b/third_party/libwebrtc/include/rtc_audio_device.h deleted file mode 100644 index cff7b4a6ac..0000000000 --- a/third_party/libwebrtc/include/rtc_audio_device.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_AUDIO_DEVICE_HXX -#define LIB_WEBRTC_RTC_AUDIO_DEVICE_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -/** - * The RTCAudioDevice class is an abstract class used for managing the audio - * devices used by WebRTC. It provides methods for device enumeration and - * selection. - */ -class RTCAudioDevice : public RefCountInterface { - public: - typedef fixed_size_function OnDeviceChangeCallback; - - public: - static const int kAdmMaxDeviceNameSize = 128; - static const int kAdmMaxFileNameSize = 512; - static const int kAdmMaxGuidSize = 128; - - public: - /** - * Returns the number of playout devices available. - * - * @return int16_t - The number of playout devices available. - */ - virtual int16_t PlayoutDevices() = 0; - - /** - * Returns the number of recording devices available. - * - * @return int16_t - The number of recording devices available. - */ - virtual int16_t RecordingDevices() = 0; - - /** - * Retrieves the name and GUID of the specified playout device. - * - * @param index - The index of the device. - * @param name - The device name. - * @param guid - The device GUID. - * @return int32_t - 0 if successful, otherwise an error code. - */ - virtual int32_t PlayoutDeviceName(uint16_t index, - char name[kAdmMaxDeviceNameSize], - char guid[kAdmMaxGuidSize]) = 0; - - /** - * Retrieves the name and GUID of the specified recording device. - * - * @param index - The index of the device. - * @param name - The device name. - * @param guid - The device GUID. - * @return int32_t - 0 if successful, otherwise an error code. - */ - virtual int32_t RecordingDeviceName(uint16_t index, - char name[kAdmMaxDeviceNameSize], - char guid[kAdmMaxGuidSize]) = 0; - - /** - * Sets the playout device to use. - * - * @param index - The index of the device. - * @return int32_t - 0 if successful, otherwise an error code. - */ - virtual int32_t SetPlayoutDevice(uint16_t index) = 0; - - /** - * Sets the recording device to use. - * - * @param index - The index of the device. - * @return int32_t - 0 if successful, otherwise an error code. - */ - virtual int32_t SetRecordingDevice(uint16_t index) = 0; - - /** - * Registers a listener to be called when audio devices are added or removed. - * - * @param listener - The callback function to register. - * @return int32_t - 0 if successful, otherwise an error code. - */ - virtual int32_t OnDeviceChange(OnDeviceChangeCallback listener) = 0; - - virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0; - - virtual int32_t MicrophoneVolume(uint32_t& volume) = 0; - - virtual int32_t SetSpeakerVolume(uint32_t volume) = 0; - - virtual int32_t SpeakerVolume(uint32_t& volume) = 0; - - protected: - virtual ~RTCAudioDevice() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_AUDIO_DEVICE_HXX diff --git a/third_party/libwebrtc/include/rtc_audio_frame.h b/third_party/libwebrtc/include/rtc_audio_frame.h deleted file mode 100644 index 3f276a1676..0000000000 --- a/third_party/libwebrtc/include/rtc_audio_frame.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef AUDIO_FRAME_HXX -#define AUDIO_FRAME_HXX - -#include "media_manager_types.h" - -namespace b2bua { - -class AudioFrame { - public: - /** - * @brief Creates a new instance of AudioFrame. - * @return AudioFrame*: a pointer to the newly created AudioFrame. - */ - MEDIA_MANAGER_API static AudioFrame* Create(); - - /** - * @brief Creates a new instance of AudioFrame with specified parameters. - * @param id: the unique identifier of the frame. - * @param timestamp: the timestamp of the frame. - * @param data: a pointer to the audio data buffer. - * @param samples_per_channel: the number of samples per channel. - * @param sample_rate_hz: the sample rate in Hz. - * @param num_channels: the number of audio channels. - * @return AudioFrame*: a pointer to the newly created AudioFrame. - */ - MEDIA_MANAGER_API static AudioFrame* Create(int id, uint32_t timestamp, - const int16_t* data, - size_t samples_per_channel, - int sample_rate_hz, - size_t num_channels = 1); - - /** - * @brief Releases the memory of this AudioFrame. - */ - virtual void Release() = 0; - - public: - /** - * @brief Updates the audio frame with specified parameters. - * @param id: the unique identifier of the frame. - * @param timestamp: the timestamp of the frame. - * @param data: a pointer to the audio data buffer. - * @param samples_per_channel: the number of samples per channel. - * @param sample_rate_hz: the sample rate in Hz. - * @param num_channels: the number of audio channels. - */ - virtual void UpdateFrame(int id, uint32_t timestamp, const int16_t* data, - size_t samples_per_channel, int sample_rate_hz, - size_t num_channels = 1) = 0; - - /** - * @brief Copies the contents of another AudioFrame. - * @param src: the source AudioFrame to copy from. - */ - virtual void CopyFrom(const AudioFrame& src) = 0; - - /** - * @brief Adds another AudioFrame to this one. - * @param frame_to_add: the AudioFrame to add. - */ - virtual void Add(const AudioFrame& frame_to_add) = 0; - - /** - * @brief Mutes the audio data in this AudioFrame. - */ - virtual void Mute() = 0; - - /** - * @brief Returns a pointer to the audio data buffer. - * @return const int16_t*: a pointer to the audio data buffer. - */ - virtual const int16_t* data() = 0; - - /** - * @brief Returns the number of samples per channel. - * @return size_t: the number of samples per channel. - */ - virtual size_t samples_per_channel() = 0; - - /** - * @brief Returns the sample rate in Hz. - * @return int: the sample rate in Hz. - */ - virtual int sample_rate_hz() = 0; - - /** - * @brief Returns the number of audio channels. - * @return size_t: the number of audio channels. - */ - virtual size_t num_channels() = 0; - - /** - * @brief Returns the timestamp of the AudioFrame. - * @return uint32_t: the timestamp of the AudioFrame. - */ - virtual uint32_t timestamp() = 0; - - /** - * @brief Returns the unique identifier of the AudioFrame. - * @return int: the unique identifier of the AudioFrame. - */ - - virtual int id() = 0; -}; - -}; // namespace b2bua - -#endif diff --git a/third_party/libwebrtc/include/rtc_audio_source.h b/third_party/libwebrtc/include/rtc_audio_source.h deleted file mode 100644 index 43e39fd801..0000000000 --- a/third_party/libwebrtc/include/rtc_audio_source.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_AUDIO_SOURCE_HXX -#define LIB_WEBRTC_RTC_AUDIO_SOURCE_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -/** - * The RTCAudioSource class is a base class for audio sources in WebRTC. - * Audio sources represent the source of audio data in WebRTC, such as a - * microphone or a file. This class provides a base interface for audio - * sources to implement, allowing them to be used with WebRTC's audio - * processing and transmission mechanisms. - */ -class RTCAudioSource : public RefCountInterface { - protected: - /** - * The destructor for the RTCAudioSource class. - */ - virtual ~RTCAudioSource() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_AUDIO_TRACK_HXX diff --git a/third_party/libwebrtc/include/rtc_audio_track.h b/third_party/libwebrtc/include/rtc_audio_track.h deleted file mode 100644 index c64e4bc4a5..0000000000 --- a/third_party/libwebrtc/include/rtc_audio_track.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_AUDIO_TRACK_HXX -#define LIB_WEBRTC_RTC_AUDIO_TRACK_HXX - -#include "rtc_media_track.h" -#include "rtc_types.h" - -namespace libwebrtc { - -/** - * The RTCAudioTrack class represents an audio track in WebRTC. - * Audio tracks are used to transmit audio data over a WebRTC peer connection. - * This class is a subclass of the RTCMediaTrack class, which provides a base - * interface for all media tracks in WebRTC. - */ -class RTCAudioTrack : public RTCMediaTrack { - public: - // volume in [0-10] - virtual void SetVolume(double volume) = 0; - - protected: - /** - * The destructor for the RTCAudioTrack class. - */ - virtual ~RTCAudioTrack() {} -}; -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_AUDIO_TRACK_HXX diff --git a/third_party/libwebrtc/include/rtc_data_channel.h b/third_party/libwebrtc/include/rtc_data_channel.h deleted file mode 100644 index e1351959f2..0000000000 --- a/third_party/libwebrtc/include/rtc_data_channel.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_DATA_CHANNEL_HXX -#define LIB_WEBRTC_RTC_DATA_CHANNEL_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -/** - * The RTCDataChannelState enum represents the possible states of a WebRTC data - * channel. Data channels are used to transmit non-audio/video data over a - * WebRTC peer connection. The possible states are: connecting, open, closing, - * and closed. - */ -enum RTCDataChannelState { - RTCDataChannelConnecting, - RTCDataChannelOpen, - RTCDataChannelClosing, - RTCDataChannelClosed, -}; - -/** - * The RTCDataChannelInit struct represents the configuration options for a - * WebRTC data channel. These options include whether the channel is ordered and - * reliable, the maximum retransmit time and number of retransmits, the protocol - * to use (sctp or quic), whether the channel is negotiated, and the channel ID. - */ -struct RTCDataChannelInit { - bool ordered = true; - bool reliable = true; - int maxRetransmitTime = -1; - int maxRetransmits = -1; - string protocol = {"sctp"}; // sctp | quic - bool negotiated = false; - int id = 0; -}; - -/** - * The RTCDataChannelObserver class is an interface for receiving events related - * to a WebRTC data channel. These events include changes in the channel's state - * and incoming messages. - */ -class RTCDataChannelObserver { - public: - /** - * Called when the state of the data channel changes. - * The new state is passed as a parameter. - */ - virtual void OnStateChange(RTCDataChannelState state) = 0; - - /** - * Called when a message is received on the data channel. - * The message buffer, its length, and a boolean indicating whether the - * message is binary are passed as parameters. - */ - virtual void OnMessage(const char* buffer, int length, bool binary) = 0; - - protected: - /** - * The destructor for the RTCDataChannelObserver class. - */ - virtual ~RTCDataChannelObserver() = default; -}; - -/** - * The RTCDataChannel class represents a data channel in WebRTC. - * Data channels are used to transmit non-audio/video data over a WebRTC peer - * connection. This class provides a base interface for data channels to - * implement, allowing them to be used with WebRTC's data channel mechanisms. - */ -class RTCDataChannel : public RefCountInterface { - public: - /** - * Sends data over the data channel. - * The data buffer, its size, and a boolean indicating whether the data is - * binary are passed as parameters. - */ - virtual void Send(const uint8_t* data, uint32_t size, - bool binary = false) = 0; - - /** - * Closes the data channel. - */ - virtual void Close() = 0; - - /** - * Registers an observer for events related to the data channel. - * The observer object is passed as a parameter. - */ - virtual void RegisterObserver(RTCDataChannelObserver* observer) = 0; - - /** - * Unregisters the current observer for the data channel. - */ - virtual void UnregisterObserver() = 0; - - /** - * Returns the label of the data channel. - */ - virtual const string label() const = 0; - - /** - * Returns the ID of the data channel. - */ - virtual int id() const = 0; - - /** - * Returns the amount of data buffered in the data channel. - * - * @return uint64_t - */ - virtual uint64_t buffered_amount() const = 0; - - /** - * Returns the state of the data channel. - */ - virtual RTCDataChannelState state() = 0; - - protected: - virtual ~RTCDataChannel() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_DATA_CHANNEL_HXX diff --git a/third_party/libwebrtc/include/rtc_desktop_capturer.h b/third_party/libwebrtc/include/rtc_desktop_capturer.h deleted file mode 100644 index 9d2e955ab3..0000000000 --- a/third_party/libwebrtc/include/rtc_desktop_capturer.h +++ /dev/null @@ -1,138 +0,0 @@ -/** - * @file rtc_desktop_capturer.h - * This header file defines the interface for capturing desktop media. - */ - -#ifndef LIB_WEBRTC_RTC_DESKTOP_CAPTURER_HXX -#define LIB_WEBRTC_RTC_DESKTOP_CAPTURER_HXX - -#include "rtc_desktop_media_list.h" -#include "rtc_types.h" -#include "rtc_video_device.h" - -namespace libwebrtc { - -class DesktopCapturerObserver; - -/** - * @brief The interface for capturing desktop media. - * - * This interface defines methods for registering and deregistering observer - * for desktop capture events, starting and stopping desktop capture, and - * retrieving the current capture state and media source. - */ -class RTCDesktopCapturer : public RefCountInterface { - public: - /** - * @brief Enumeration for the possible states of desktop capture. - */ - enum CaptureState { CS_RUNNING, CS_STOPPED, CS_FAILED }; - - public: - /** - * @brief Registers the given observer for desktop capture events. - * - * @param observer Pointer to the observer to be registered. - */ - virtual void RegisterDesktopCapturerObserver( - DesktopCapturerObserver* observer) = 0; - - /** - * @brief Deregisters the currently registered desktop capture observer. - */ - virtual void DeRegisterDesktopCapturerObserver() = 0; - - /** - * @brief Starts desktop capture with the given frame rate. - * - * @param fps The desired frame rate. - * - * @return The current capture state after attempting to start capture. - */ - virtual CaptureState Start(uint32_t fps) = 0; - - /** - * @brief Starts desktop capture with the given frame rate and capture - * dimensions. - * - * @param fps The desired frame rate. - * @param x The left-most pixel coordinate of the capture region. - * @param y The top-most pixel coordinate of the capture region. - * @param w The width of the capture region. - * @param h The height of the capture region. - * - * @return The current capture state after attempting to start capture. - */ - virtual CaptureState Start(uint32_t fps, uint32_t x, uint32_t y, uint32_t w, - uint32_t h) = 0; - - /** - * @brief Stops desktop capture. - */ - virtual void Stop() = 0; - - /** - * @brief Checks if desktop capture is currently running. - * - * @return True if capture is running, false otherwise. - */ - virtual bool IsRunning() = 0; - - /** - * @brief Retrieves the media source for the current desktop capture. - * - * @return A scoped_refptr representing the current capture - * media source. - */ - virtual scoped_refptr source() = 0; - - /** - * @brief Destroys the RTCDesktopCapturer object. - */ - virtual ~RTCDesktopCapturer() {} -}; - -/** - * @brief Observer interface for desktop capturer events. - * - * This class defines the interface for an observer of the DesktopCapturer - * class, allowing clients to be notified of events such as when capturing - * begins or ends, and when an error occurs. - */ -class DesktopCapturerObserver { - public: - /** - * @brief Called when desktop capture starts. - * - * @param capturer A reference to the capturer that started capturing. - */ - virtual void OnStart(scoped_refptr capturer) = 0; - - /** - * @brief Called when desktop capture is paused. - * - * @param capturer A reference to the capturer that paused capturing. - */ - virtual void OnPaused(scoped_refptr capturer) = 0; - - /** - * @brief Called when desktop capture stops. - * - * @param capturer A reference to the capturer that stopped capturing. - */ - virtual void OnStop(scoped_refptr capturer) = 0; - - /** - * @brief Called when an error occurs during desktop capture. - * - * @param capturer A reference to the capturer that encountered an error. - */ - virtual void OnError(scoped_refptr capturer) = 0; - - protected: - ~DesktopCapturerObserver() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_DESKTOP_CAPTURER_HXX diff --git a/third_party/libwebrtc/include/rtc_desktop_device.h b/third_party/libwebrtc/include/rtc_desktop_device.h deleted file mode 100644 index e3e4c6fab1..0000000000 --- a/third_party/libwebrtc/include/rtc_desktop_device.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_DESKTOP_DEVICE_HXX -#define LIB_WEBRTC_RTC_DESKTOP_DEVICE_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class MediaSource; -class RTCDesktopCapturer; -class RTCDesktopMediaList; - -class RTCDesktopDevice : public RefCountInterface { - public: - virtual scoped_refptr CreateDesktopCapturer( - scoped_refptr source) = 0; - virtual scoped_refptr GetDesktopMediaList( - DesktopType type) = 0; - - protected: - virtual ~RTCDesktopDevice() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_VIDEO_DEVICE_HXX \ No newline at end of file diff --git a/third_party/libwebrtc/include/rtc_desktop_media_list.h b/third_party/libwebrtc/include/rtc_desktop_media_list.h deleted file mode 100644 index 48faf2a959..0000000000 --- a/third_party/libwebrtc/include/rtc_desktop_media_list.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_DESKTOP_MEDIA_LIST_HXX -#define LIB_WEBRTC_RTC_DESKTOP_MEDIA_LIST_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class MediaSource : public RefCountInterface { - public: - // source id - virtual string id() const = 0; - - // source name - virtual string name() const = 0; - - // Returns the thumbnail of the source, jpeg format. - virtual portable::vector thumbnail() const = 0; - - virtual DesktopType type() const = 0; - - virtual bool UpdateThumbnail() = 0; - - protected: - virtual ~MediaSource() {} -}; - -class MediaListObserver { - public: - virtual void OnMediaSourceAdded(scoped_refptr source) = 0; - - virtual void OnMediaSourceRemoved(scoped_refptr source) = 0; - - virtual void OnMediaSourceNameChanged(scoped_refptr source) = 0; - - virtual void OnMediaSourceThumbnailChanged( - scoped_refptr source) = 0; - - protected: - virtual ~MediaListObserver() {} -}; - -class RTCDesktopMediaList : public RefCountInterface { - public: - virtual void RegisterMediaListObserver(MediaListObserver* observer) = 0; - - virtual void DeRegisterMediaListObserver() = 0; - - virtual DesktopType type() const = 0; - - virtual int32_t UpdateSourceList(bool force_reload = false, - bool get_thumbnail = true) = 0; - - virtual int GetSourceCount() const = 0; - - virtual scoped_refptr GetSource(int index) = 0; - - virtual bool GetThumbnail(scoped_refptr source, - bool notify = false) = 0; - - protected: - ~RTCDesktopMediaList() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_DESKTOP_MEDIA_LIST_HXX \ No newline at end of file diff --git a/third_party/libwebrtc/include/rtc_dtls_transport.h b/third_party/libwebrtc/include/rtc_dtls_transport.h deleted file mode 100644 index fe7adad7f0..0000000000 --- a/third_party/libwebrtc/include/rtc_dtls_transport.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef LIB_WEBRTC_DTLS_TRANSPORT_H_ -#define LIB_WEBRTC_DTLS_TRANSPORT_H_ - -#include "base/refcount.h" -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCDtlsTransportInformation : public RefCountInterface { - public: - enum class RTCDtlsTransportState { - kNew, // Has not started negotiating yet. - kConnecting, // In the process of negotiating a secure connection. - kConnected, // Completed negotiation and verified fingerprints. - kClosed, // Intentionally closed. - kFailed, // Failure due to an error or failing to verify a remote - // fingerprint. - kNumValues - }; - virtual RTCDtlsTransportInformation& operator=( - scoped_refptr c) = 0; - - virtual RTCDtlsTransportState state() const = 0; - virtual int ssl_cipher_suite() const = 0; - virtual int srtp_cipher_suite() const = 0; -}; - -class RTCDtlsTransportObserver { - public: - virtual void OnStateChange(RTCDtlsTransportInformation info) = 0; - - virtual void OnError(const int type, const char* message) = 0; - - protected: - virtual ~RTCDtlsTransportObserver() = default; -}; - -class RTCDtlsTransport : public RefCountInterface { - LIB_WEBRTC_API static scoped_refptr Create(); - - public: - virtual scoped_refptr GetInformation() = 0; - - virtual void RegisterObserver(RTCDtlsTransportObserver* observer) = 0; - - virtual void UnregisterObserver() = 0; -}; - -} // namespace libwebrtc - -#endif // API_DTLS_TRANSPORT_INTERFACE_H_ diff --git a/third_party/libwebrtc/include/rtc_dtmf_sender.h b/third_party/libwebrtc/include/rtc_dtmf_sender.h deleted file mode 100644 index 7f42cc56b5..0000000000 --- a/third_party/libwebrtc/include/rtc_dtmf_sender.h +++ /dev/null @@ -1,47 +0,0 @@ - -#ifndef LIB_WEBRTC_DTMF_SENDER__H_ -#define LIB_WEBRTC_DTMF_SENDER__H_ - -#include "base/refcount.h" -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCDtmfSenderObserver { - public: - virtual void OnToneChange(const string tone, const string tone_buffer) = 0; - - virtual void OnToneChange(const string tone) = 0; - - protected: - virtual ~RTCDtmfSenderObserver() = default; -}; - -class RTCDtmfSender : public RefCountInterface { - public: - static const int kDtmfDefaultCommaDelayMs = 2000; - - virtual void RegisterObserver(RTCDtmfSenderObserver* observer) = 0; - - virtual void UnregisterObserver() = 0; - - virtual bool InsertDtmf(const string tones, int duration, - int inter_tone_gap) = 0; - - virtual bool InsertDtmf(const string tones, int duration, int inter_tone_gap, - int comma_delay) = 0; - - virtual bool CanInsertDtmf() = 0; - - virtual const string tones() const = 0; - - virtual int duration() const = 0; - - virtual int inter_tone_gap() const = 0; - - virtual int comma_delay() const = 0; -}; - -} // namespace libwebrtc - -#endif // API_DTMF_SENDER__H_ diff --git a/third_party/libwebrtc/include/rtc_frame_cryptor.h b/third_party/libwebrtc/include/rtc_frame_cryptor.h deleted file mode 100644 index 47f3a409b7..0000000000 --- a/third_party/libwebrtc/include/rtc_frame_cryptor.h +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef LIB_RTC_FRAME_CYRPTOR_H_ -#define LIB_RTC_FRAME_CYRPTOR_H_ - -#include "base/refcount.h" -#include "rtc_peerconnection_factory.h" -#include "rtc_rtp_receiver.h" -#include "rtc_rtp_sender.h" -#include "rtc_types.h" - -namespace libwebrtc { - -enum class Algorithm { - kAesGcm = 0, - kAesCbc, -}; - -#define DEFAULT_KEYRING_SIZE 16 -#define MAX_KEYRING_SIZE 255 - -struct KeyProviderOptions { - bool shared_key; - vector ratchet_salt; - vector uncrypted_magic_bytes; - int ratchet_window_size; - int failure_tolerance; - // The size of the key ring. between 1 and 255. - int key_ring_size; - bool discard_frame_when_cryptor_not_ready; - KeyProviderOptions() - : shared_key(false), - ratchet_salt(vector()), - ratchet_window_size(0), - failure_tolerance(-1), - key_ring_size(DEFAULT_KEYRING_SIZE), - discard_frame_when_cryptor_not_ready(false) {} - KeyProviderOptions(KeyProviderOptions& copy) - : shared_key(copy.shared_key), - ratchet_salt(copy.ratchet_salt), - ratchet_window_size(copy.ratchet_window_size), - failure_tolerance(copy.failure_tolerance), - key_ring_size(copy.key_ring_size) {} -}; - -/// Shared secret key for frame encryption. -class KeyProvider : public RefCountInterface { - public: - LIB_WEBRTC_API static scoped_refptr Create(KeyProviderOptions*); - - virtual bool SetSharedKey(int index, vector key) = 0; - - virtual vector RatchetSharedKey(int key_index) = 0; - - virtual vector ExportSharedKey(int key_index) = 0; - - /// Set the key at the given index. - virtual bool SetKey(const string participant_id, int index, - vector key) = 0; - - virtual vector RatchetKey(const string participant_id, - int key_index) = 0; - - virtual vector ExportKey(const string participant_id, - int key_index) = 0; - - virtual void SetSifTrailer(vector trailer) = 0; - - protected: - virtual ~KeyProvider() {} -}; - -enum RTCFrameCryptionState { - kNew = 0, - kOk, - kEncryptionFailed, - kDecryptionFailed, - kMissingKey, - kKeyRatcheted, - kInternalError, -}; - -class RTCFrameCryptorObserver : public RefCountInterface { - public: - virtual void OnFrameCryptionStateChanged(const string participant_id, - RTCFrameCryptionState state) = 0; - - protected: - virtual ~RTCFrameCryptorObserver() {} -}; - -/// Frame encryption/decryption. -/// -class RTCFrameCryptor : public RefCountInterface { - public: - /// Enable/Disable frame crypto for the sender or receiver. - virtual bool SetEnabled(bool enabled) = 0; - - /// Get the enabled state for the sender or receiver. - virtual bool enabled() const = 0; - - /// Set the key index for the sender or receiver. - /// If the key index is not set, the key index will be set to 0. - virtual bool SetKeyIndex(int index) = 0; - - /// Get the key index for the sender or receiver. - virtual int key_index() const = 0; - - virtual const string participant_id() const = 0; - - virtual void RegisterRTCFrameCryptorObserver( - scoped_refptr observer) = 0; - - virtual void DeRegisterRTCFrameCryptorObserver() = 0; - - protected: - virtual ~RTCFrameCryptor() {} -}; - -class FrameCryptorFactory { - public: - /// Create a frame cyrptor for [RTCRtpSender]. - LIB_WEBRTC_API static scoped_refptr - frameCryptorFromRtpSender(scoped_refptr factory, - const string participant_id, - scoped_refptr sender, - Algorithm algorithm, - scoped_refptr key_provider); - - /// Create a frame cyrptor for [RTCRtpReceiver]. - LIB_WEBRTC_API static scoped_refptr - frameCryptorFromRtpReceiver(scoped_refptr factory, - const string participant_id, - scoped_refptr receiver, - Algorithm algorithm, - scoped_refptr key_provider); -}; - -} // namespace libwebrtc - -#endif // LIB_RTC_FRAME_CYRPTOR_H_ \ No newline at end of file diff --git a/third_party/libwebrtc/include/rtc_ice_candidate.h b/third_party/libwebrtc/include/rtc_ice_candidate.h deleted file mode 100644 index 82da46edb4..0000000000 --- a/third_party/libwebrtc/include/rtc_ice_candidate.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_ICE_CANDIDATE_HXX -#define LIB_WEBRTC_RTC_ICE_CANDIDATE_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCIceCandidate : public RefCountInterface { - public: - static LIB_WEBRTC_API scoped_refptr Create( - const string sdp, const string sdp_mid, int sdp_mline_index, - SdpParseError* error); - - public: - virtual const string candidate() const = 0; - - virtual const string sdp_mid() const = 0; - - virtual int sdp_mline_index() const = 0; - - virtual bool ToString(string& out) = 0; - - protected: - virtual ~RTCIceCandidate() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_ICE_CANDIDATE_HXX diff --git a/third_party/libwebrtc/include/rtc_ice_transport.h b/third_party/libwebrtc/include/rtc_ice_transport.h deleted file mode 100644 index 645f305b2d..0000000000 --- a/third_party/libwebrtc/include/rtc_ice_transport.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2019 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef LIB_WEBRTC_RTC_ICE_TRANSPORT_H_ -#define LIB_WEBRTC_RTC_ICE_TRANSPORT_H_ - -#include - -#include "api/async_dns_resolver.h" -#include "api/async_resolver_factory.h" -#include "api/rtc_error.h" -#include "api/rtc_event_log/rtc_event_log.h" -#include "api/scoped_refptr.h" -#include "rtc_base/ref_count.h" - -namespace libwebrtc { - -class IceTransport : public RefCountInterface { - public: - virtual IceTransport* internal() = 0; -}; - -class IceTransportInit final { - public: - IceTransportInit() = default; - IceTransportInit(const IceTransportInit&) = delete; - IceTransportInit(IceTransportInit&&) = default; - IceTransportInit& operator=(const IceTransportInit&) = delete; - IceTransportInit& operator=(IceTransportInit&&) = default; - - cricket::PortAllocator* port_allocator() { return port_allocator_; } - void set_port_allocator(cricket::PortAllocator* port_allocator) { - port_allocator_ = port_allocator; - } - - AsyncDnsResolverFactoryInterface* async_dns_resolver_factory() { - return async_dns_resolver_factory_; - } - void set_async_dns_resolver_factory( - AsyncDnsResolverFactoryInterface* async_dns_resolver_factory) { - RTC_DCHECK(!async_resolver_factory_); - async_dns_resolver_factory_ = async_dns_resolver_factory; - } - AsyncResolverFactory* async_resolver_factory() { - return async_resolver_factory_; - } - ABSL_DEPRECATED("bugs.webrtc.org/12598") - void set_async_resolver_factory( - AsyncResolverFactory* async_resolver_factory) { - RTC_DCHECK(!async_dns_resolver_factory_); - async_resolver_factory_ = async_resolver_factory; - } - - RtcEventLog* event_log() { return event_log_; } - void set_event_log(RtcEventLog* event_log) { event_log_ = event_log; } -}; - -class IceTransportFactory { - public: - virtual ~IceTransportFactory() = default; - - virtual scoped_refptr CreateIceTransport( - const std::string& transport_name, int component, - IceTransportInit init) = 0; -}; - -} // namespace libwebrtc -#endif // API_ICE_TRANSPORT_INTERFACE_H_ diff --git a/third_party/libwebrtc/include/rtc_media_stream.h b/third_party/libwebrtc/include/rtc_media_stream.h deleted file mode 100644 index 17c04d1ba4..0000000000 --- a/third_party/libwebrtc/include/rtc_media_stream.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_MEDIA_STREAM_HXX -#define LIB_WEBRTC_RTC_MEDIA_STREAM_HXX - -#include "rtc_audio_track.h" -#include "rtc_types.h" -#include "rtc_video_track.h" - -namespace libwebrtc { - -class RTCMediaStream : public RefCountInterface { - public: - virtual bool AddTrack(scoped_refptr track) = 0; - - virtual bool AddTrack(scoped_refptr track) = 0; - - virtual bool RemoveTrack(scoped_refptr track) = 0; - - virtual bool RemoveTrack(scoped_refptr track) = 0; - - virtual vector> audio_tracks() = 0; - - virtual vector> video_tracks() = 0; - - virtual vector> tracks() = 0; - - virtual scoped_refptr FindAudioTrack( - const string track_id) = 0; - - virtual scoped_refptr FindVideoTrack( - const string track_id) = 0; - - virtual const string label() = 0; - - virtual const string id() = 0; - - protected: - ~RTCMediaStream() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_MEDIA_STREAM_HXX diff --git a/third_party/libwebrtc/include/rtc_media_track.h b/third_party/libwebrtc/include/rtc_media_track.h deleted file mode 100644 index ff5a2f743e..0000000000 --- a/third_party/libwebrtc/include/rtc_media_track.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_MEDIA_TRACK_HXX -#define LIB_WEBRTC_RTC_MEDIA_TRACK_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -/*Media Track interface*/ -class RTCMediaTrack : public RefCountInterface { - public: - enum RTCTrackState { - kLive, - kEnded, - }; - virtual RTCTrackState state() const = 0; - - /*track type: audio/video*/ - virtual const string kind() const = 0; - - /*track id*/ - virtual const string id() const = 0; - - virtual bool enabled() const = 0; - - /*mute track*/ - virtual bool set_enabled(bool enable) = 0; - - protected: - ~RTCMediaTrack() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_MEDIA_TRACK_HXX diff --git a/third_party/libwebrtc/include/rtc_mediaconstraints.h b/third_party/libwebrtc/include/rtc_mediaconstraints.h deleted file mode 100644 index 2596e6153f..0000000000 --- a/third_party/libwebrtc/include/rtc_mediaconstraints.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_MEDIA_CONSTRAINTS_HXX -#define LIB_WEBRTC_RTC_MEDIA_CONSTRAINTS_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCMediaConstraints : public RefCountInterface { - public: - // These keys are google specific. - LIB_WEBRTC_API static const char* - kGoogEchoCancellation; // googEchoCancellation - - LIB_WEBRTC_API static const char* - kExtendedFilterEchoCancellation; // googEchoCancellation2 - LIB_WEBRTC_API static const char* - kDAEchoCancellation; // googDAEchoCancellation - LIB_WEBRTC_API static const char* kAutoGainControl; // googAutoGainControl - LIB_WEBRTC_API static const char* kNoiseSuppression; // googNoiseSuppression - LIB_WEBRTC_API static const char* kHighpassFilter; // googHighpassFilter - LIB_WEBRTC_API static const char* kAudioMirroring; // googAudioMirroring - LIB_WEBRTC_API static const char* - kAudioNetworkAdaptorConfig; // goodAudioNetworkAdaptorConfig - - // Constraint keys for CreateOffer / CreateAnswer - // Specified by the W3C PeerConnection spec - LIB_WEBRTC_API static const char* - kOfferToReceiveVideo; // OfferToReceiveVideo - LIB_WEBRTC_API static const char* - kOfferToReceiveAudio; // OfferToReceiveAudio - LIB_WEBRTC_API static const char* - kVoiceActivityDetection; // VoiceActivityDetection - LIB_WEBRTC_API static const char* kIceRestart; // IceRestart - // These keys are google specific. - LIB_WEBRTC_API static const char* kUseRtpMux; // googUseRtpMUX - - // Constraints values. - LIB_WEBRTC_API static const char* kValueTrue; // true - LIB_WEBRTC_API static const char* kValueFalse; // false - - // PeerConnection constraint keys. - // Temporary pseudo-constraints used to enable DataChannels - LIB_WEBRTC_API static const char* - kEnableRtpDataChannels; // Enable RTP DataChannels - // Google-specific constraint keys. - // Temporary pseudo-constraint for enabling DSCP through JS. - LIB_WEBRTC_API static const char* kEnableDscp; // googDscp - // Constraint to enable IPv6 through JS. - LIB_WEBRTC_API static const char* kEnableIPv6; // googIPv6 - // Temporary constraint to enable suspend below min bitrate feature. - LIB_WEBRTC_API static const char* kEnableVideoSuspendBelowMinBitrate; - // googSuspendBelowMinBitrate - // Constraint to enable combined audio+video bandwidth estimation. - //LIB_WEBRTC_API static const char* - // kCombinedAudioVideoBwe; // googCombinedAudioVideoBwe - LIB_WEBRTC_API static const char* - kScreencastMinBitrate; // googScreencastMinBitrate - LIB_WEBRTC_API static const char* - kCpuOveruseDetection; // googCpuOveruseDetection - - // Specifies number of simulcast layers for all video tracks - // with a Plan B offer/answer - // (see RTCOfferAnswerOptions::num_simulcast_layers). - LIB_WEBRTC_API static const char* kNumSimulcastLayers; - - public: - LIB_WEBRTC_API static scoped_refptr Create(); - - virtual void AddMandatoryConstraint(const string key, const string value) = 0; - - virtual void AddOptionalConstraint(const string key, const string value) = 0; - - protected: - virtual ~RTCMediaConstraints() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_MEDIA_CONSTRAINTS_HXX diff --git a/third_party/libwebrtc/include/rtc_peerconnection.h b/third_party/libwebrtc/include/rtc_peerconnection.h deleted file mode 100644 index 35ea2ad3ea..0000000000 --- a/third_party/libwebrtc/include/rtc_peerconnection.h +++ /dev/null @@ -1,273 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_PEERCONNECTION_HXX -#define LIB_WEBRTC_RTC_PEERCONNECTION_HXX - -#include "rtc_audio_track.h" -#include "rtc_data_channel.h" -#include "rtc_ice_candidate.h" -#include "rtc_media_stream.h" -#include "rtc_mediaconstraints.h" -#include "rtc_rtp_sender.h" -#include "rtc_rtp_transceiver.h" -#include "rtc_session_description.h" -#include "rtc_video_source.h" -#include "rtc_video_track.h" - -namespace libwebrtc { - -enum SessionDescriptionErrorType { - kPeerConnectionInitFailed = 0, - kCreatePeerConnectionFailed, - kSDPParseFailed, -}; - -enum RTCPeerConnectionState { - RTCPeerConnectionStateNew, - RTCPeerConnectionStateConnecting, - RTCPeerConnectionStateConnected, - RTCPeerConnectionStateDisconnected, - RTCPeerConnectionStateFailed, - RTCPeerConnectionStateClosed, -}; - -enum RTCSignalingState { - RTCSignalingStateStable, - RTCSignalingStateHaveLocalOffer, - RTCSignalingStateHaveRemoteOffer, - RTCSignalingStateHaveLocalPrAnswer, - RTCSignalingStateHaveRemotePrAnswer, - RTCSignalingStateClosed -}; - -enum RTCIceGatheringState { - RTCIceGatheringStateNew, - RTCIceGatheringStateGathering, - RTCIceGatheringStateComplete -}; - -enum RTCIceConnectionState { - RTCIceConnectionStateNew, - RTCIceConnectionStateChecking, - RTCIceConnectionStateCompleted, - RTCIceConnectionStateConnected, - RTCIceConnectionStateFailed, - RTCIceConnectionStateDisconnected, - RTCIceConnectionStateClosed, - RTCIceConnectionStateMax, -}; - -class RTCStatsMember : public RefCountInterface { - public: - // Member value types. - enum Type { - kBool, // bool - kInt32, // int32_t - kUint32, // uint32_t - kInt64, // int64_t - kUint64, // uint64_t - kDouble, // double - kString, // std::string - - kSequenceBool, // std::vector - kSequenceInt32, // std::vector - kSequenceUint32, // std::vector - kSequenceInt64, // std::vector - kSequenceUint64, // std::vector - kSequenceDouble, // std::vector - kSequenceString, // std::vector - - kMapStringUint64, // std::map - kMapStringDouble, // std::map - }; - - public: - virtual string GetName() const = 0; - virtual Type GetType() const = 0; - virtual bool IsDefined() const = 0; - - virtual bool ValueBool() const = 0; - virtual int32_t ValueInt32() const = 0; - virtual uint32_t ValueUint32() const = 0; - virtual int64_t ValueInt64() const = 0; - virtual uint64_t ValueUint64() const = 0; - virtual double ValueDouble() const = 0; - virtual string ValueString() const = 0; - virtual vector ValueSequenceBool() const = 0; - virtual vector ValueSequenceInt32() const = 0; - virtual vector ValueSequenceUint32() const = 0; - virtual vector ValueSequenceInt64() const = 0; - virtual vector ValueSequenceUint64() const = 0; - virtual vector ValueSequenceDouble() const = 0; - virtual vector ValueSequenceString() const = 0; - virtual map ValueMapStringUint64() const = 0; - virtual map ValueMapStringDouble() const = 0; - - protected: - virtual ~RTCStatsMember() {} -}; - -class MediaRTCStats : public RefCountInterface { - public: - virtual const string id() = 0; - - virtual const string type() = 0; - - virtual int64_t timestamp_us() = 0; - - virtual const string ToJson() = 0; - - virtual const vector> Members() = 0; -}; - -typedef fixed_size_function> reports)> - OnStatsCollectorSuccess; - -typedef fixed_size_function OnStatsCollectorFailure; - -typedef fixed_size_function - OnSdpCreateSuccess; - -typedef fixed_size_function OnSdpCreateFailure; - -typedef fixed_size_function OnSetSdpSuccess; - -typedef fixed_size_function OnSetSdpFailure; - -typedef fixed_size_function - OnGetSdpSuccess; - -typedef fixed_size_function OnGetSdpFailure; - -class RTCPeerConnectionObserver { - public: - virtual void OnSignalingState(RTCSignalingState state) = 0; - - virtual void OnPeerConnectionState(RTCPeerConnectionState state) = 0; - - virtual void OnIceGatheringState(RTCIceGatheringState state) = 0; - - virtual void OnIceConnectionState(RTCIceConnectionState state) = 0; - - virtual void OnIceCandidate(scoped_refptr candidate) = 0; - - virtual void OnAddStream(scoped_refptr stream) = 0; - - virtual void OnRemoveStream(scoped_refptr stream) = 0; - - virtual void OnDataChannel(scoped_refptr data_channel) = 0; - - virtual void OnRenegotiationNeeded() = 0; - - virtual void OnTrack(scoped_refptr transceiver) = 0; - - virtual void OnAddTrack(vector> streams, - scoped_refptr receiver) = 0; - - virtual void OnRemoveTrack(scoped_refptr receiver) = 0; - - protected: - virtual ~RTCPeerConnectionObserver() {} -}; - -class RTCPeerConnection : public RefCountInterface { - public: - virtual int AddStream(scoped_refptr stream) = 0; - - virtual int RemoveStream(scoped_refptr stream) = 0; - - virtual scoped_refptr CreateLocalMediaStream( - const string stream_id) = 0; - - virtual scoped_refptr CreateDataChannel( - const string label, RTCDataChannelInit* dataChannelDict) = 0; - - virtual void CreateOffer(OnSdpCreateSuccess success, - OnSdpCreateFailure failure, - scoped_refptr constraints) = 0; - - virtual void CreateAnswer(OnSdpCreateSuccess success, - OnSdpCreateFailure failure, - scoped_refptr constraints) = 0; - - virtual void RestartIce() = 0; - - virtual void Close() = 0; - - virtual void SetLocalDescription(const string sdp, const string type, - OnSetSdpSuccess success, - OnSetSdpFailure failure) = 0; - - virtual void SetRemoteDescription(const string sdp, const string type, - OnSetSdpSuccess success, - OnSetSdpFailure failure) = 0; - - virtual void GetLocalDescription(OnGetSdpSuccess success, - OnGetSdpFailure failure) = 0; - - virtual void GetRemoteDescription(OnGetSdpSuccess success, - OnGetSdpFailure failure) = 0; - - virtual void AddCandidate(const string mid, int mid_mline_index, - const string candiate) = 0; - - virtual void RegisterRTCPeerConnectionObserver( - RTCPeerConnectionObserver* observer) = 0; - - virtual void DeRegisterRTCPeerConnectionObserver() = 0; - - virtual vector> local_streams() = 0; - - virtual vector> remote_streams() = 0; - - virtual bool GetStats(scoped_refptr sender, - OnStatsCollectorSuccess success, - OnStatsCollectorFailure failure) = 0; - - virtual bool GetStats(scoped_refptr receiver, - OnStatsCollectorSuccess success, - OnStatsCollectorFailure failure) = 0; - - virtual void GetStats(OnStatsCollectorSuccess success, - OnStatsCollectorFailure failure) = 0; - - virtual scoped_refptr AddTransceiver( - scoped_refptr track, - scoped_refptr init) = 0; - - virtual scoped_refptr AddTransceiver( - scoped_refptr track) = 0; - - virtual scoped_refptr AddTrack( - scoped_refptr track, const vector streamIds) = 0; - - virtual scoped_refptr AddTransceiver( - RTCMediaType media_type) = 0; - - virtual scoped_refptr AddTransceiver( - RTCMediaType media_type, scoped_refptr init) = 0; - - virtual bool RemoveTrack(scoped_refptr render) = 0; - - virtual vector> senders() = 0; - - virtual vector> transceivers() = 0; - - virtual vector> receivers() = 0; - - virtual RTCSignalingState signaling_state() = 0; - - virtual RTCIceConnectionState ice_connection_state() = 0; - - virtual RTCIceConnectionState standardized_ice_connection_state() = 0; - - virtual RTCPeerConnectionState peer_connection_state() = 0; - - virtual RTCIceGatheringState ice_gathering_state() = 0; - - protected: - virtual ~RTCPeerConnection() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_PEERCONNECTION_HXX diff --git a/third_party/libwebrtc/include/rtc_peerconnection_factory.h b/third_party/libwebrtc/include/rtc_peerconnection_factory.h deleted file mode 100644 index cb024672c2..0000000000 --- a/third_party/libwebrtc/include/rtc_peerconnection_factory.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_PEERCONNECTION_FACTORY_HXX -#define LIB_WEBRTC_RTC_PEERCONNECTION_FACTORY_HXX - -#include "rtc_audio_source.h" -#include "rtc_audio_track.h" -#include "rtc_types.h" -#ifdef RTC_DESKTOP_DEVICE -#include "rtc_desktop_device.h" -#endif -#include "rtc_media_stream.h" -#include "rtc_mediaconstraints.h" -#include "rtc_video_device.h" -#include "rtc_video_source.h" - -namespace libwebrtc { - -class RTCPeerConnection; -class RTCAudioDevice; -class RTCVideoDevice; -class RTCRtpCapabilities; - -class RTCPeerConnectionFactory : public RefCountInterface { - public: - virtual bool Initialize() = 0; - - virtual bool Terminate() = 0; - - virtual scoped_refptr Create( - const RTCConfiguration& configuration, - scoped_refptr constraints) = 0; - - virtual void Delete(scoped_refptr peerconnection) = 0; - - virtual scoped_refptr GetAudioDevice() = 0; - - virtual scoped_refptr GetVideoDevice() = 0; -#ifdef RTC_DESKTOP_DEVICE - virtual scoped_refptr GetDesktopDevice() = 0; -#endif - virtual scoped_refptr CreateAudioSource( - const string audio_source_label) = 0; - - virtual scoped_refptr CreateVideoSource( - scoped_refptr capturer, const string video_source_label, - scoped_refptr constraints) = 0; -#ifdef RTC_DESKTOP_DEVICE - virtual scoped_refptr CreateDesktopSource( - scoped_refptr capturer, - const string video_source_label, - scoped_refptr constraints) = 0; -#endif - virtual scoped_refptr CreateAudioTrack( - scoped_refptr source, const string track_id) = 0; - - virtual scoped_refptr CreateVideoTrack( - scoped_refptr source, const string track_id) = 0; - - virtual scoped_refptr CreateStream( - const string stream_id) = 0; - - virtual scoped_refptr GetRtpSenderCapabilities( - RTCMediaType media_type) = 0; - - virtual scoped_refptr GetRtpReceiverCapabilities( - RTCMediaType media_type) = 0; -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_PEERCONNECTION_FACTORY_HXX diff --git a/third_party/libwebrtc/include/rtc_rtp_capabilities.h b/third_party/libwebrtc/include/rtc_rtp_capabilities.h deleted file mode 100644 index 39b49765fc..0000000000 --- a/third_party/libwebrtc/include/rtc_rtp_capabilities.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef LIB_WBBRTC_RTC_RTP_CAPABILITIES_HXX -#define LIB_WBBRTC_RTC_RTP_CAPABILITIES_HXX - -#include "base/refcount.h" -#include "base/scoped_ref_ptr.h" -#include "rtc_rtp_parameters.h" -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCRtpCodecCapability : public RefCountInterface { - public: - LIB_WEBRTC_API static scoped_refptr Create(); - - virtual void set_mime_type(const string& mime_type) = 0; - virtual void set_clock_rate(int clock_rate) = 0; - virtual void set_channels(int channels) = 0; - virtual void set_sdp_fmtp_line(const string& sdp_fmtp_line) = 0; - - virtual string mime_type() const = 0; - virtual int clock_rate() const = 0; - virtual int channels() const = 0; - virtual string sdp_fmtp_line() const = 0; - - protected: - virtual ~RTCRtpCodecCapability() {} -}; - -class RTCRtpHeaderExtensionCapability : public RefCountInterface { - public: - virtual const string uri() = 0; - virtual void set_uri(const string uri) = 0; - - virtual int preferred_id() = 0; - virtual void set_preferred_id(int value) = 0; - - virtual bool preferred_encrypt() = 0; - virtual void set_preferred_encrypt(bool value) = 0; -}; - -class RTCRtpCapabilities : public RefCountInterface { - public: - virtual const vector> codecs() = 0; - virtual void set_codecs( - const vector> codecs) = 0; - - virtual const vector> - header_extensions() = 0; - - virtual void set_header_extensions( - const vector> - header_extensions) = 0; - - // virtual const vector> fec() = 0; - // virtual void set_fec(const vector> fec) = 0; -}; - -} // namespace libwebrtc - -#endif // LIB_WBBRTC_RTC_RTP_CAPABILITIES_HXX diff --git a/third_party/libwebrtc/include/rtc_rtp_parameters.h b/third_party/libwebrtc/include/rtc_rtp_parameters.h deleted file mode 100644 index 3ef87155d5..0000000000 --- a/third_party/libwebrtc/include/rtc_rtp_parameters.h +++ /dev/null @@ -1,243 +0,0 @@ -#ifndef LIB_WBBRTC_RTC_RTP_PARAMETERS_HXX -#define LIB_WBBRTC_RTC_RTP_PARAMETERS_HXX - -#include "base/refcount.h" -#include "base/scoped_ref_ptr.h" -#include "rtc_types.h" - -namespace libwebrtc { - -enum class RTCRtpTransceiverDirection { - kSendRecv, - kSendOnly, - kRecvOnly, - kInactive, - kStopped, -}; - -enum class RTCFecMechanism { - RED, - RED_AND_ULPFEC, - FLEXFEC, -}; - -enum class RTCRtcpFeedbackType { - CCM, - LNTF, - NACK, - REMB, - TRANSPORT_CC, -}; - -enum class RTCRtcpFeedbackMessageType { - GENERIC_NACK, - PLI, - FIR, -}; - -enum class RTCDtxStatus { - DISABLED, - ENABLED, -}; - -enum class RTCDegradationPreference { - DISABLED, - MAINTAIN_FRAMERATE, - MAINTAIN_RESOLUTION, - BALANCED, -}; - -class RTCRtcpFeedback : public RefCountInterface { - virtual RTCRtcpFeedbackType type() = 0; - virtual void set_type(RTCRtcpFeedbackType value) = 0; - - virtual RTCRtcpFeedbackMessageType message_type() = 0; - virtual void set_message_type(RTCRtcpFeedbackMessageType value) = 0; - - virtual bool operator==(scoped_refptr o) = 0; - virtual bool operator!=(scoped_refptr o) = 0; -}; - -class RTCRtpExtension : public RefCountInterface { - public: - enum RTCFilter { - kDiscardEncryptedExtension, - kPreferEncryptedExtension, - kRequireEncryptedExtension, - }; - - virtual const string ToString() const = 0; - virtual bool operator==(scoped_refptr o) const = 0; - - virtual const string uri() = 0; - virtual void set_uri(const string uri) = 0; - - virtual int id() = 0; - virtual void set_id(int value) = 0; - - virtual bool encrypt() = 0; - virtual void set_encrypt(bool value) = 0; -}; - -class RtpFecParameters : public RefCountInterface { - virtual uint32_t ssrc() = 0; - virtual void set_ssrc(uint32_t value) = 0; - - virtual RTCFecMechanism mechanism() = 0; - virtual void set_mechanism(RTCFecMechanism value) = 0; - - virtual bool operator==(const RtpFecParameters& o) const = 0; - virtual bool operator!=(const RtpFecParameters& o) const = 0; -}; - -class RTCRtpRtxParameters : public RefCountInterface { - virtual uint32_t ssrc() = 0; - virtual void set_ssrc(uint32_t value) = 0; - - virtual bool operator==(scoped_refptr o) const = 0; - - virtual bool operator!=(scoped_refptr o) const = 0; -}; - -class RTCRtpCodecParameters : public RefCountInterface { - public: - virtual const string mime_type() const = 0; - - virtual const string name() = 0; - virtual void set_name(const string name) = 0; - - virtual RTCMediaType kind() = 0; - virtual void set_kind(RTCMediaType value) = 0; - - virtual int payload_type() = 0; - virtual void set_payload_type(int value) = 0; - - virtual int clock_rate() = 0; - virtual void set_clock_rate(int value) = 0; - - virtual int num_channels() = 0; - virtual void set_num_channels(int value) = 0; - - virtual int max_ptime() = 0; - virtual void set_max_ptime(int value) = 0; - - virtual int ptime() = 0; - virtual void set_ptime(int value) = 0; - - virtual const vector> rtcp_feedback() = 0; - virtual void set_rtcp_feedback( - const vector> feecbacks) = 0; - - virtual const vector> parameters() = 0; - virtual void set_parameters(const map parameters) = 0; - - virtual bool operator==(scoped_refptr o) = 0; - virtual bool operator!=(scoped_refptr o) = 0; - - protected: - virtual ~RTCRtpCodecParameters() {} -}; - -class RTCRtcpParameters : public RefCountInterface { - public: - virtual uint32_t ssrc() = 0; - virtual void set_ssrc(uint32_t value) = 0; - - virtual const string cname() = 0; - virtual void set_cname(const string) = 0; - - virtual bool reduced_size() = 0; - virtual void set_reduced_size(bool value) = 0; - - virtual bool mux() = 0; - virtual void set_mux(bool value) = 0; - - virtual bool operator==(scoped_refptr o) const = 0; - virtual bool operator!=(scoped_refptr o) const = 0; -}; - -enum class RTCPriority { - kVeryLow, - kLow, - kMedium, - kHigh, -}; - -class RTCRtpEncodingParameters : public RefCountInterface { - public: - LIB_WEBRTC_API static scoped_refptr Create(); - - virtual uint32_t ssrc() = 0; - virtual void set_ssrc(uint32_t value) = 0; - - virtual double bitrate_priority() = 0; - virtual void set_bitrate_priority(double value) = 0; - - virtual RTCPriority network_priority() = 0; - virtual void set_network_priority(RTCPriority value) = 0; - - virtual int max_bitrate_bps() = 0; - virtual void set_max_bitrate_bps(int value) = 0; - - virtual int min_bitrate_bps() = 0; - virtual void set_min_bitrate_bps(int value) = 0; - - virtual double max_framerate() = 0; - virtual void set_max_framerate(double value) = 0; - - virtual int num_temporal_layers() = 0; - virtual void set_num_temporal_layers(int value) = 0; - - virtual double scale_resolution_down_by() = 0; - virtual void set_scale_resolution_down_by(double value) = 0; - - virtual const string scalability_mode() = 0; - virtual void set_scalability_mode(const string mode) = 0; - - virtual bool active() = 0; - virtual void set_active(bool value) = 0; - - virtual const string rid() = 0; - virtual void set_rid(const string rid) = 0; - - virtual bool adaptive_ptime() = 0; - virtual void set_adaptive_ptime(bool value) = 0; - - virtual bool operator==(scoped_refptr o) const = 0; - virtual bool operator!=(scoped_refptr o) const = 0; -}; - -struct RTCRtpParameters : public RefCountInterface { - public: - // static scoped_refptr Create(); - virtual const string transaction_id() = 0; - virtual void set_transaction_id(const string id) = 0; - - virtual const string mid() = 0; - virtual void set_mid(const string mid) = 0; - - virtual const vector> codecs() = 0; - virtual void set_codecs( - const vector> codecs) = 0; - - virtual const vector> header_extensions() = 0; - virtual void set_header_extensions( - const vector> header_extensions) = 0; - - virtual const vector> encodings() = 0; - virtual void set_encodings( - const vector> encodings) = 0; - - virtual scoped_refptr rtcp_parameters() = 0; - virtual void set_rtcp_parameters( - scoped_refptr rtcp_parameters) = 0; - - virtual RTCDegradationPreference GetDegradationPreference() = 0; - virtual void SetDegradationPreference(RTCDegradationPreference value) = 0; - - virtual bool operator==(scoped_refptr o) const = 0; - virtual bool operator!=(scoped_refptr o) const = 0; -}; - -} // namespace libwebrtc -#endif // LIB_WBBRTC_RTC_RTP_PARAMETERS_HXX \ No newline at end of file diff --git a/third_party/libwebrtc/include/rtc_rtp_receiver.h b/third_party/libwebrtc/include/rtc_rtp_receiver.h deleted file mode 100644 index a72f2b8a06..0000000000 --- a/third_party/libwebrtc/include/rtc_rtp_receiver.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef LIB_WEBRTC_RTP_RECEIVER_HXX -#define LIB_WEBRTC_RTP_RECEIVER_HXX - -#include "base/refcount.h" -#include "base/scoped_ref_ptr.h" -#include "rtc_rtp_parameters.h" -#include "rtc_types.h" - -// #include "rtc_frame_decryptor.h" -// #include "rtc_frame_encryptor.h" - -namespace libwebrtc { - -class RTCMediaTrack; -class RTCMediaStream; -class RTCDtlsTransport; - -class RTCRtpReceiverObserver { - public: - virtual void OnFirstPacketReceived(RTCMediaType media_type) = 0; - - protected: - virtual ~RTCRtpReceiverObserver() {} -}; - -class RTCRtpReceiver : public RefCountInterface { - public: - virtual scoped_refptr track() const = 0; - - virtual scoped_refptr dtls_transport() const = 0; - - virtual const vector stream_ids() const = 0; - - virtual vector> streams() const = 0; - - virtual RTCMediaType media_type() const = 0; - - virtual const string id() const = 0; - - virtual scoped_refptr parameters() const = 0; - - virtual bool set_parameters(scoped_refptr parameters) = 0; - - virtual void SetObserver(RTCRtpReceiverObserver* observer) = 0; - - virtual void SetJitterBufferMinimumDelay(double delay_seconds) = 0; - - // virtual Vector GetSources() const = 0; - - // virtual void SetFrameDecryptor( - // scoped_refptr frame_decryptor); - - // virtual scoped_refptr GetFrameDecryptor() const = 0; - - // virtual void SetDepacketizerToDecoderFrameTransformer( - // scoped_refptr frame_transformer) = 0; -}; - -} // namespace libwebrtc - -#endif // !LIB_WEBRTC_RTP_RECEIVER_H_ \ No newline at end of file diff --git a/third_party/libwebrtc/include/rtc_rtp_sender.h b/third_party/libwebrtc/include/rtc_rtp_sender.h deleted file mode 100644 index 9c2f73249b..0000000000 --- a/third_party/libwebrtc/include/rtc_rtp_sender.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_RTP_SENDER_HXX -#define LIB_WEBRTC_RTC_RTP_SENDER_HXX - -#include "base/refcount.h" -#include "base/scoped_ref_ptr.h" -#include "rtc_rtp_parameters.h" -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCMediaTrack; -class RTCDtlsTransport; -class RTCDtmfSender; - -class RTCRtpSender : public RefCountInterface { - public: - virtual bool set_track(scoped_refptr track) = 0; - - virtual scoped_refptr track() const = 0; - - virtual scoped_refptr dtls_transport() const = 0; - - virtual uint32_t ssrc() const = 0; - - virtual RTCMediaType media_type() const = 0; - - virtual const string id() const = 0; - - virtual const vector stream_ids() const = 0; - - virtual void set_stream_ids(const vector stream_ids) const = 0; - - virtual const vector> - init_send_encodings() const = 0; - - virtual scoped_refptr parameters() const = 0; - - virtual bool set_parameters( - const scoped_refptr parameters) = 0; - - virtual scoped_refptr dtmf_sender() const = 0; -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_TYPES_HXX \ No newline at end of file diff --git a/third_party/libwebrtc/include/rtc_rtp_transceiver.h b/third_party/libwebrtc/include/rtc_rtp_transceiver.h deleted file mode 100644 index ecf24f45b6..0000000000 --- a/third_party/libwebrtc/include/rtc_rtp_transceiver.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_RTP_TRANSCEIVER_HXX -#define LIB_WEBRTC_RTC_RTP_TRANSCEIVER_HXX - -#include "base/refcount.h" -#include "rtc_rtp_capabilities.h" -#include "rtc_rtp_parameters.h" -#include "rtc_rtp_receiver.h" -#include "rtc_rtp_sender.h" -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCRtpTransceiverInit : public RefCountInterface { - public: - LIB_WEBRTC_API static scoped_refptr Create( - RTCRtpTransceiverDirection direction, const vector stream_ids, - const vector> encodings); - - virtual RTCRtpTransceiverDirection direction() = 0; - virtual void set_direction(RTCRtpTransceiverDirection value) = 0; - - virtual const vector stream_ids() = 0; - virtual void set_stream_ids(const vector ids) = 0; - - virtual const vector> - send_encodings() = 0; - virtual void set_send_encodings( - const vector> send_encodings) = 0; -}; - -class RTCRtpTransceiver : public RefCountInterface { - public: - virtual RTCMediaType media_type() const = 0; - - virtual const string mid() const = 0; - - virtual scoped_refptr sender() const = 0; - - virtual scoped_refptr receiver() const = 0; - - virtual bool Stopped() const = 0; - - virtual bool Stopping() const = 0; - - virtual RTCRtpTransceiverDirection direction() const = 0; - - virtual const string SetDirectionWithError( - RTCRtpTransceiverDirection new_direction) = 0; - - virtual RTCRtpTransceiverDirection current_direction() const = 0; - - virtual RTCRtpTransceiverDirection fired_direction() const = 0; - - virtual const string StopStandard() = 0; - - virtual void StopInternal() = 0; - - virtual void SetCodecPreferences( - vector> codecs) = 0; - - virtual const string transceiver_id() const = 0; -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_TYPES_HXX diff --git a/third_party/libwebrtc/include/rtc_session_description.h b/third_party/libwebrtc/include/rtc_session_description.h deleted file mode 100644 index 84aa2abbc9..0000000000 --- a/third_party/libwebrtc/include/rtc_session_description.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_SESSION_DESCRIPTION_HXX -#define LIB_WEBRTC_RTC_SESSION_DESCRIPTION_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCSessionDescription : public RefCountInterface { - public: - enum SdpType { kOffer = 0, kPrAnswer, kAnswer }; - - static LIB_WEBRTC_API scoped_refptr Create( - const string type, const string sdp, SdpParseError* error); - - public: - virtual const string sdp() const = 0; - - virtual const string type() = 0; - - virtual SdpType GetType() = 0; - - virtual bool ToString(string& out) = 0; - - protected: - virtual ~RTCSessionDescription() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_SESSION_DESCRIPTION_HXX \ No newline at end of file diff --git a/third_party/libwebrtc/include/rtc_types.h b/third_party/libwebrtc/include/rtc_types.h deleted file mode 100644 index 017386d071..0000000000 --- a/third_party/libwebrtc/include/rtc_types.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_TYPES_HXX -#define LIB_WEBRTC_RTC_TYPES_HXX - -#ifdef LIB_WEBRTC_API_EXPORTS -#define LIB_WEBRTC_API __declspec(dllexport) -#elif defined(LIB_WEBRTC_API_DLL) -#define LIB_WEBRTC_API __declspec(dllimport) -#elif !defined(WIN32) -#define LIB_WEBRTC_API __attribute__((visibility("default"))) -#else -#define LIB_WEBRTC_API -#endif - -#include "base/fixed_size_function.h" -#include "base/portable.h" -#include "base/refcount.h" -#include "base/scoped_ref_ptr.h" - -namespace libwebrtc { - -enum { kMaxIceServerSize = 8 }; - -// template -// using vector = bsp::inlined_vector; - -template -using map = std::map; - -enum class MediaSecurityType { kSRTP_None = 0, kSDES_SRTP, kDTLS_SRTP }; - -enum class RTCMediaType { AUDIO, VIDEO, DATA, UNSUPPORTED }; - -using string = portable::string; - -// template -// using map = portable::map; - -template -using vector = portable::vector; - -struct IceServer { - string uri; - string username; - string password; -}; - -enum class IceTransportsType { kNone, kRelay, kNoHost, kAll }; - -enum class TcpCandidatePolicy { - kTcpCandidatePolicyEnabled, - kTcpCandidatePolicyDisabled -}; - -enum class CandidateNetworkPolicy { - kCandidateNetworkPolicyAll, - kCandidateNetworkPolicyLowCost -}; - -enum class RtcpMuxPolicy { - kRtcpMuxPolicyNegotiate, - kRtcpMuxPolicyRequire, -}; - -enum BundlePolicy { - kBundlePolicyBalanced, - kBundlePolicyMaxBundle, - kBundlePolicyMaxCompat -}; - -enum class SdpSemantics { kPlanB, kUnifiedPlan }; - -struct RTCConfiguration { - IceServer ice_servers[kMaxIceServerSize]; - IceTransportsType type = IceTransportsType::kAll; - BundlePolicy bundle_policy = BundlePolicy::kBundlePolicyBalanced; - RtcpMuxPolicy rtcp_mux_policy = RtcpMuxPolicy::kRtcpMuxPolicyRequire; - CandidateNetworkPolicy candidate_network_policy = - CandidateNetworkPolicy::kCandidateNetworkPolicyAll; - TcpCandidatePolicy tcp_candidate_policy = - TcpCandidatePolicy::kTcpCandidatePolicyEnabled; - - int ice_candidate_pool_size = 0; - - MediaSecurityType srtp_type = MediaSecurityType::kDTLS_SRTP; - SdpSemantics sdp_semantics = SdpSemantics::kUnifiedPlan; - bool offer_to_receive_audio = true; - bool offer_to_receive_video = true; - - bool disable_ipv6 = false; - bool disable_ipv6_on_wifi = false; - int max_ipv6_networks = 5; - bool disable_link_local_networks = false; - int screencast_min_bitrate = -1; - - // private - bool use_rtp_mux = true; - uint32_t local_audio_bandwidth = 128; - uint32_t local_video_bandwidth = 512; -}; - -struct SdpParseError { - public: - // The sdp line that causes the error. - string line; - // Explains the error. - string description; -}; - -enum DesktopType { kScreen, kWindow }; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_TYPES_HXX diff --git a/third_party/libwebrtc/include/rtc_video_device.h b/third_party/libwebrtc/include/rtc_video_device.h deleted file mode 100644 index 130849767c..0000000000 --- a/third_party/libwebrtc/include/rtc_video_device.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_VIDEO_DEVICE_HXX -#define LIB_WEBRTC_RTC_VIDEO_DEVICE_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCVideoCapturer : public RefCountInterface { - public: - virtual ~RTCVideoCapturer() {} - - virtual bool StartCapture() = 0; - - virtual bool CaptureStarted() = 0; - - virtual void StopCapture() = 0; -}; - -class RTCVideoDevice : public RefCountInterface { - public: - virtual uint32_t NumberOfDevices() = 0; - - virtual int32_t GetDeviceName(uint32_t deviceNumber, char* deviceNameUTF8, - uint32_t deviceNameLength, - char* deviceUniqueIdUTF8, - uint32_t deviceUniqueIdUTF8Length, - char* productUniqueIdUTF8 = 0, - uint32_t productUniqueIdUTF8Length = 0) = 0; - - virtual scoped_refptr Create(const char* name, - uint32_t index, size_t width, - size_t height, - size_t target_fps) = 0; - - protected: - virtual ~RTCVideoDevice() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_VIDEO_DEVICE_HXX diff --git a/third_party/libwebrtc/include/rtc_video_frame.h b/third_party/libwebrtc/include/rtc_video_frame.h deleted file mode 100644 index a69023f052..0000000000 --- a/third_party/libwebrtc/include/rtc_video_frame.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_VIDEO_FRAME_HXX -#define LIB_WEBRTC_RTC_VIDEO_FRAME_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCVideoFrame : public RefCountInterface { - public: - enum class Type { kARGB, kBGRA, kABGR, kRGBA }; - - enum VideoRotation { - kVideoRotation_0 = 0, - kVideoRotation_90 = 90, - kVideoRotation_180 = 180, - kVideoRotation_270 = 270 - }; - - public: - LIB_WEBRTC_API static scoped_refptr Create( - int width, int height, const uint8_t* buffer, int length); - - LIB_WEBRTC_API static scoped_refptr Create( - int width, int height, const uint8_t* data_y, int stride_y, - const uint8_t* data_u, int stride_u, const uint8_t* data_v, int stride_v); - - virtual scoped_refptr Copy() = 0; - - // The resolution of the frame in pixels. For formats where some planes are - // subsampled, this is the highest-resolution plane. - virtual int width() const = 0; - virtual int height() const = 0; - - virtual VideoRotation rotation() = 0; - - // Returns pointer to the pixel data for a given plane. The memory is owned by - // the VideoFrameBuffer object and must not be freed by the caller. - virtual const uint8_t* DataY() const = 0; - virtual const uint8_t* DataU() const = 0; - virtual const uint8_t* DataV() const = 0; - - // Returns the number of bytes between successive rows for a given plane. - virtual int StrideY() const = 0; - virtual int StrideU() const = 0; - virtual int StrideV() const = 0; - - virtual int ConvertToARGB(Type type, uint8_t* dst_argb, int dst_stride_argb, - int dest_width, int dest_height) = 0; - - protected: - virtual ~RTCVideoFrame() {} -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_VIDEO_FRAME_HXX diff --git a/third_party/libwebrtc/include/rtc_video_renderer.h b/third_party/libwebrtc/include/rtc_video_renderer.h deleted file mode 100644 index 7e81d463f6..0000000000 --- a/third_party/libwebrtc/include/rtc_video_renderer.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_VIDEO_RENDERER_HXX -#define LIB_WEBRTC_RTC_VIDEO_RENDERER_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -template -class RTCVideoRenderer { - public: - virtual ~RTCVideoRenderer() {} - - virtual void OnFrame(VideoFrameT frame) = 0; -}; - -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_VIDEO_RENDERER_HXX diff --git a/third_party/libwebrtc/include/rtc_video_source.h b/third_party/libwebrtc/include/rtc_video_source.h deleted file mode 100644 index cb61abbb49..0000000000 --- a/third_party/libwebrtc/include/rtc_video_source.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_VIDEO_SOURCE_HXX -#define LIB_WEBRTC_RTC_VIDEO_SOURCE_HXX - -#include "rtc_types.h" - -namespace libwebrtc { - -class RTCVideoSource : public RefCountInterface { - public: - ~RTCVideoSource() {} -}; -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_VIDEO_SOURCE_HXX diff --git a/third_party/libwebrtc/include/rtc_video_track.h b/third_party/libwebrtc/include/rtc_video_track.h deleted file mode 100644 index 46850c5861..0000000000 --- a/third_party/libwebrtc/include/rtc_video_track.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef LIB_WEBRTC_RTC_VIDEO_TRACK_HXX -#define LIB_WEBRTC_RTC_VIDEO_TRACK_HXX - -#include "rtc_media_track.h" -#include "rtc_types.h" -#include "rtc_video_frame.h" -#include "rtc_video_renderer.h" - -namespace libwebrtc { - -class RTCVideoTrack : public RTCMediaTrack { - public: - virtual void AddRenderer( - RTCVideoRenderer>* renderer) = 0; - - virtual void RemoveRenderer( - RTCVideoRenderer>* renderer) = 0; - - protected: - ~RTCVideoTrack() {} -}; -} // namespace libwebrtc - -#endif // LIB_WEBRTC_RTC_VIDEO_TRACK_HXX diff --git a/third_party/libwebrtc/lib/elinux-arm64/libwebrtc.so b/third_party/libwebrtc/lib/elinux-arm64/libwebrtc.so deleted file mode 120000 index 6f27e3aef9..0000000000 --- a/third_party/libwebrtc/lib/elinux-arm64/libwebrtc.so +++ /dev/null @@ -1 +0,0 @@ -../linux-arm64/libwebrtc.so \ No newline at end of file diff --git a/third_party/libwebrtc/lib/elinux-x64/libwebrtc.so b/third_party/libwebrtc/lib/elinux-x64/libwebrtc.so deleted file mode 120000 index 8d3fde68ca..0000000000 --- a/third_party/libwebrtc/lib/elinux-x64/libwebrtc.so +++ /dev/null @@ -1 +0,0 @@ -../linux-x64/libwebrtc.so \ No newline at end of file diff --git a/third_party/libwebrtc/lib/linux-arm64/libwebrtc.so b/third_party/libwebrtc/lib/linux-arm64/libwebrtc.so deleted file mode 100755 index 22c3bde89f..0000000000 Binary files a/third_party/libwebrtc/lib/linux-arm64/libwebrtc.so and /dev/null differ diff --git a/third_party/libwebrtc/lib/linux-x64/libwebrtc.so b/third_party/libwebrtc/lib/linux-x64/libwebrtc.so deleted file mode 100755 index ae9c4eec39..0000000000 Binary files a/third_party/libwebrtc/lib/linux-x64/libwebrtc.so and /dev/null differ diff --git a/third_party/libwebrtc/lib/win64/libwebrtc.dll b/third_party/libwebrtc/lib/win64/libwebrtc.dll deleted file mode 100644 index e62437621a..0000000000 Binary files a/third_party/libwebrtc/lib/win64/libwebrtc.dll and /dev/null differ diff --git a/third_party/libwebrtc/lib/win64/libwebrtc.dll.lib b/third_party/libwebrtc/lib/win64/libwebrtc.dll.lib deleted file mode 100644 index c982e9577b..0000000000 Binary files a/third_party/libwebrtc/lib/win64/libwebrtc.dll.lib and /dev/null differ diff --git a/third_party/uuidxx/LICENSE b/third_party/uuidxx/LICENSE deleted file mode 100644 index 6eaf314417..0000000000 --- a/third_party/uuidxx/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2016 by NeoSmart Technologies - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/third_party/uuidxx/uuidxx.cc b/third_party/uuidxx/uuidxx.cc deleted file mode 100644 index a504635c24..0000000000 --- a/third_party/uuidxx/uuidxx.cc +++ /dev/null @@ -1,104 +0,0 @@ -#ifdef _WIN32 -#ifndef _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS -#endif -#endif - -#include "uuidxx.h" -#include -#include -#include -#include - -using namespace std; -using namespace uuidxx; - -bool uuid::operator==(const uuid& guid2) const { - return memcmp(&guid2, this, sizeof(uuid)) == 0; -} - -bool uuid::operator!=(const uuid& guid2) const { - return !(*this == guid2); -} - -bool uuid::operator<(const uuid& guid2) const { - return memcmp(this, &guid2, sizeof(uuid)) < 0; -} - -bool uuid::operator>(const uuid& guid2) const { - return memcmp(this, &guid2, sizeof(uuid)) > 0; -} - -uuid::uuid(const std::string& uuidString) : uuid(uuidString.c_str()) {} - -uuid::uuid(const char* uuidString) { - if (uuidString == nullptr) { - // special case, and prevents random bugs - memset(this, 0, sizeof(uuid)); - return; - } - - if (uuidString[0] == '{') { - sscanf(uuidString, - "{%08" SCNx32 "-%04" SCNx16 "-%04" SCNx16 "-%02" SCNx8 "%02" SCNx8 - "-%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 - "%02" SCNx8 "}", - &Uuid.Data1, &Uuid.Data2, &Uuid.Data3, &Uuid.Data4[0], - &Uuid.Data4[1], &Uuid.Data4[2], &Uuid.Data4[3], &Uuid.Data4[4], - &Uuid.Data4[5], &Uuid.Data4[6], &Uuid.Data4[7]); - } else { - sscanf(uuidString, - "%08" SCNx32 "-%04" SCNx16 "-%04" SCNx16 "-%02" SCNx8 "%02" SCNx8 - "-%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 "%02" SCNx8 - "%02" SCNx8 "", - &Uuid.Data1, &Uuid.Data2, &Uuid.Data3, &Uuid.Data4[0], - &Uuid.Data4[1], &Uuid.Data4[2], &Uuid.Data4[3], &Uuid.Data4[4], - &Uuid.Data4[5], &Uuid.Data4[6], &Uuid.Data4[7]); - } -} - -string uuid::ToString(bool withBraces) const { - char buffer[39]; - sprintf(buffer, "%s%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X%s", - withBraces ? "{" : "", Uuid.Data1, Uuid.Data2, Uuid.Data3, - Uuid.Data4[0], Uuid.Data4[1], Uuid.Data4[2], Uuid.Data4[3], - Uuid.Data4[4], Uuid.Data4[5], Uuid.Data4[6], Uuid.Data4[7], - withBraces ? "}" : ""); - return buffer; -} - -uuid uuid::FromString(const char* uuidString) { - uuid temp(uuidString); - return temp; -} - -uuid uuid::FromString(const std::string& uuidString) { - uuid temp(uuidString.c_str()); - return temp; -} - -uuid uuid::Generatev4() { - // mach-o does not support TLS and clang still has issues with thread_local -#if !defined(__APPLE__) && !defined(__clang__) - thread_local std::random_device rd; - thread_local auto gen = std::mt19937_64(rd()); -#else - std::random_device rd; - std::mt19937_64 gen(rd()); -#endif - std::uniform_int_distribution dis64; - - uuid newGuid; - newGuid.WideIntegers[0] = dis64(gen); - newGuid.WideIntegers[1] = dis64(gen); - - // RFC4122 defines (psuedo)random uuids (in big-endian notation): - // MSB of DATA4[0] specifies the variant and should be 0b10 to indicate - // standard uuid, and MSB of DATA3 should be 0b0100 to indicate version 4 - newGuid.Bytes.Data4[0] = - (newGuid.Bytes.Data4[0] & 0x3F) | static_cast(0x80); - newGuid.Bytes.Data3[1] = - (newGuid.Bytes.Data3[1] & 0x0F) | static_cast(0x40); - - return newGuid; -} diff --git a/third_party/uuidxx/uuidxx.h b/third_party/uuidxx/uuidxx.h deleted file mode 100644 index 2d36271886..0000000000 --- a/third_party/uuidxx/uuidxx.h +++ /dev/null @@ -1,66 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace uuidxx { -enum class Variant { Nil, Version1, Version2, Version3, Version4, Version5 }; - -class NotImplemented : public std::logic_error { - public: - NotImplemented() : std::logic_error("Function not yet implemented"){}; -}; - -union uuid { - private: - static uuid Generatev4(); - - public: - uint64_t WideIntegers[2]; - struct _internalData { - uint32_t Data1; - uint16_t Data2; - uint16_t Data3; - uint8_t Data4[8]; - } Uuid; - struct _byteRepresentation { - uint8_t Data1[4]; - uint8_t Data2[2]; - uint8_t Data3[2]; - uint8_t Data4[8]; - } Bytes; - - bool operator==(const uuid& guid2) const; - bool operator!=(const uuid& guid2) const; - bool operator<(const uuid& guid2) const; - bool operator>(const uuid& guid2) const; - - uuid() = default; - - uuid(const char* uuidString); - uuid(const std::string& uuidString); - static uuid FromString(const char* uuidString); - static uuid FromString(const std::string& uuidString); - - static inline uuid Generate(Variant v = Variant::Version4) { - switch (v) { - case Variant::Nil: - return uuid(nullptr); // special case; - case Variant::Version1: - case Variant::Version2: - case Variant::Version3: - case Variant::Version5: - throw new NotImplemented(); - case Variant::Version4: - return Generatev4(); - } - return uuid(nullptr); - } - - std::string ToString(bool withBraces = true) const; -}; - -static_assert(sizeof(uuid) == 2 * sizeof(int64_t), - "Check uuid type declaration/padding!"); -} // namespace uuidxx diff --git a/webrtc.iml b/webrtc.iml deleted file mode 100644 index dc7eab90a0..0000000000 --- a/webrtc.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/webrtc_android.iml b/webrtc_android.iml deleted file mode 100644 index 0ebb6c9fe7..0000000000 --- a/webrtc_android.iml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 39ee5943ac..8410fd79c2 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -2,6 +2,13 @@ cmake_minimum_required(VERSION 3.15) set(PROJECT_NAME "flutter_webrtc") project(${PROJECT_NAME} LANGUAGES CXX) +if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") + cmake_policy(SET CMP0135 NEW) +endif() + +# Add the libwebrtc dependency +include("${CMAKE_CURRENT_SOURCE_DIR}/../third_party/CMakeLists.txt") + # This value is used when generating builds using this plugin, so it must # not be changed set(PLUGIN_NAME "flutter_webrtc_plugin") @@ -20,7 +27,6 @@ add_library(${PLUGIN_NAME} SHARED "../common/cpp/src/flutter_screen_capture.cc" "../common/cpp/src/flutter_webrtc.cc" "../common/cpp/src/flutter_webrtc_base.cc" - "../third_party/uuidxx/uuidxx.cc" "flutter_webrtc_plugin.cc" "task_runner_windows.cc" ) @@ -28,7 +34,6 @@ add_library(${PLUGIN_NAME} SHARED include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/../common/cpp/include" - "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/uuidxx" "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/svpng" "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/libwebrtc/include" ) @@ -39,6 +44,8 @@ set_target_properties(${PLUGIN_NAME} PROPERTIES target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/../common/cpp/include" + "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/libwebrtc/include" ) target_link_libraries(${PLUGIN_NAME} PRIVATE flutter diff --git a/windows/flutter_webrtc/flutter_web_r_t_c_plugin.h b/windows/flutter_webrtc/flutter_web_r_t_c_plugin.h index ed2d45208b..5065110e4f 100644 --- a/windows/flutter_webrtc/flutter_web_r_t_c_plugin.h +++ b/windows/flutter_webrtc/flutter_web_r_t_c_plugin.h @@ -9,6 +9,10 @@ #define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) #endif +namespace flutter_webrtc_plugin { +class FlutterWebRTC; +} // namespace flutter_webrtc_plugin + #if defined(__cplusplus) extern "C" { #endif @@ -16,6 +20,8 @@ extern "C" { FLUTTER_PLUGIN_EXPORT void FlutterWebRTCPluginRegisterWithRegistrar( FlutterDesktopPluginRegistrarRef registrar); +FLUTTER_PLUGIN_EXPORT flutter_webrtc_plugin::FlutterWebRTC* FlutterWebRTCPluginSharedInstance(); + #if defined(__cplusplus) } // extern "C" #endif diff --git a/windows/flutter_webrtc_plugin.cc b/windows/flutter_webrtc_plugin.cc index 836989c00e..f766d98239 100644 --- a/windows/flutter_webrtc_plugin.cc +++ b/windows/flutter_webrtc_plugin.cc @@ -7,6 +7,7 @@ #include const char* kChannelName = "FlutterWebRTC.Method"; +static flutter_webrtc_plugin::FlutterWebRTC* g_shared_instance = nullptr; namespace flutter_webrtc_plugin { @@ -23,7 +24,6 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin { // Uses new instead of make_unique due to private constructor. std::unique_ptr plugin( new FlutterWebRTCPluginImpl(registrar, std::move(channel))); - channel_pointer->SetMethodCallHandler( [plugin_pointer = plugin.get()](const auto& call, auto result) { plugin_pointer->HandleMethodCall(call, std::move(result)); @@ -49,6 +49,7 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin { textures_(registrar->texture_registrar()), task_runner_(std::make_unique()) { webrtc_ = std::make_unique(this); + g_shared_instance = webrtc_.get(); } // Called when a method is called on |channel_|; @@ -76,4 +77,8 @@ void FlutterWebRTCPluginRegisterWithRegistrar( flutter_webrtc_plugin::FlutterWebRTCPluginImpl::RegisterWithRegistrar( flutter::PluginRegistrarManager::GetInstance() ->GetRegistrar(registrar)); -} \ No newline at end of file +} + +flutter_webrtc_plugin::FlutterWebRTC* FlutterWebRTCPluginSharedInstance() { + return g_shared_instance; +} \ No newline at end of file pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy