organize video types
This commit is contained in:
@@ -23,6 +23,6 @@ export 'src/track/remote/audio.dart';
|
|||||||
export 'src/track/remote/remote.dart';
|
export 'src/track/remote/remote.dart';
|
||||||
export 'src/track/remote/video.dart';
|
export 'src/track/remote/video.dart';
|
||||||
export 'src/track/track.dart';
|
export 'src/track/track.dart';
|
||||||
export 'src/types.dart';
|
export 'src/types/other.dart';
|
||||||
export 'src/utils.dart';
|
export 'src/utils.dart';
|
||||||
export 'src/widget/video_track_renderer.dart';
|
export 'src/widget/video_track_renderer.dart';
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
|
||||||
|
|
||||||
// In order to *not* need this ignore, consider extracting the "web" version
|
// In order to *not* need this ignore, consider extracting the "web" version
|
||||||
// of your plugin as a separate package, instead of inlining it in the same
|
// of your plugin as a separate package, instead of inlining it in the same
|
||||||
// package as the core of your plugin.
|
// package as the core of your plugin.
|
||||||
|
|
||||||
// ignore: unused_import
|
// ignore: unused_import
|
||||||
import 'dart:html' as html show document, ScriptElement;
|
import 'dart:html' as html show document, ScriptElement; // import_sorter: keep
|
||||||
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
|
|
||||||
|
|
||||||
/// A web implementation of the Livekit plugin.
|
/// A web implementation of the Livekit plugin.
|
||||||
class LiveKitWebPlugin {
|
class LiveKitWebPlugin {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
import 'package:livekit_client/src/support/websocket.dart';
|
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
import '../constants.dart';
|
import '../constants.dart';
|
||||||
@@ -19,7 +19,9 @@ import '../options.dart';
|
|||||||
import '../proto/livekit_models.pb.dart' as lk_models;
|
import '../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../types.dart';
|
import '../support/websocket.dart';
|
||||||
|
import '../types/other.dart';
|
||||||
|
import '../types/video_dimensions.dart';
|
||||||
import '../utils.dart';
|
import '../utils.dart';
|
||||||
import 'room.dart';
|
import 'room.dart';
|
||||||
import 'signal_client.dart';
|
import 'signal_client.dart';
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import '../proto/livekit_models.pb.dart' as lk_models;
|
|||||||
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../track/track.dart';
|
import '../track/track.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
import 'engine.dart';
|
import 'engine.dart';
|
||||||
|
|
||||||
/// Room is the primary construct for LiveKit conferences. It contains a
|
/// Room is the primary construct for LiveKit conferences. It contains a
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ import '../proto/livekit_models.pb.dart' as lk_models;
|
|||||||
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../support/websocket.dart';
|
import '../support/websocket.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
|
import '../types/video_dimensions.dart';
|
||||||
import '../utils.dart';
|
import '../utils.dart';
|
||||||
|
|
||||||
class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
|
class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import '../extensions.dart';
|
|||||||
import '../internal/types.dart';
|
import '../internal/types.dart';
|
||||||
import '../logger.dart';
|
import '../logger.dart';
|
||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
import '../utils.dart';
|
import '../utils.dart';
|
||||||
|
|
||||||
typedef PCTransportOnOffer = void Function(rtc.RTCSessionDescription offer);
|
typedef PCTransportOnOffer = void Function(rtc.RTCSessionDescription offer);
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ import 'publication/local.dart';
|
|||||||
import 'publication/remote.dart';
|
import 'publication/remote.dart';
|
||||||
import 'publication/track_publication.dart';
|
import 'publication/track_publication.dart';
|
||||||
import 'track/track.dart';
|
import 'track/track.dart';
|
||||||
import 'types.dart';
|
import 'types/other.dart';
|
||||||
|
|
||||||
/// Base type for all LiveKit events.
|
/// Base type for all LiveKit events.
|
||||||
mixin LiveKitEvent {}
|
mixin LiveKitEvent {}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import 'events.dart';
|
|||||||
import 'managers/event.dart';
|
import 'managers/event.dart';
|
||||||
import 'proto/livekit_models.pb.dart' as lk_models;
|
import 'proto/livekit_models.pb.dart' as lk_models;
|
||||||
import 'proto/livekit_rtc.pb.dart' as lk_rtc;
|
import 'proto/livekit_rtc.pb.dart' as lk_rtc;
|
||||||
import 'types.dart';
|
import 'types/other.dart';
|
||||||
|
|
||||||
extension DataPacketKindExt on lk_models.DataPacket_Kind {
|
extension DataPacketKindExt on lk_models.DataPacket_Kind {
|
||||||
Reliability toSDKType() => {
|
Reliability toSDKType() => {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import '../events.dart';
|
|||||||
import '../proto/livekit_models.pb.dart' as lk_models;
|
import '../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
||||||
import '../track/track.dart';
|
import '../track/track.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
|
|
||||||
abstract class InternalEvent implements LiveKitEvent {}
|
abstract class InternalEvent implements LiveKitEvent {}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import '../exceptions.dart';
|
|||||||
import '../extensions.dart';
|
import '../extensions.dart';
|
||||||
import '../logger.dart';
|
import '../logger.dart';
|
||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
|
|
||||||
mixin EventsEmittable<T> {
|
mixin EventsEmittable<T> {
|
||||||
final events = EventsEmitter<T>();
|
final events = EventsEmitter<T>();
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ import 'track/local/audio.dart';
|
|||||||
import 'track/local/video.dart';
|
import 'track/local/video.dart';
|
||||||
import 'track/options.dart';
|
import 'track/options.dart';
|
||||||
import 'track/track.dart';
|
import 'track/track.dart';
|
||||||
import 'types.dart';
|
import 'types/other.dart';
|
||||||
|
import 'types/video_encoding.dart';
|
||||||
|
import 'types/video_parameters.dart';
|
||||||
|
|
||||||
/// Options used when connecting to the server.
|
/// Options used when connecting to the server.
|
||||||
class ConnectOptions {
|
class ConnectOptions {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
@@ -15,7 +16,8 @@ import '../publication/local.dart';
|
|||||||
import '../track/local/audio.dart';
|
import '../track/local/audio.dart';
|
||||||
import '../track/local/local.dart';
|
import '../track/local/local.dart';
|
||||||
import '../track/local/video.dart';
|
import '../track/local/video.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
|
import '../types/video_dimensions.dart';
|
||||||
import '../utils.dart';
|
import '../utils.dart';
|
||||||
import 'participant.dart';
|
import 'participant.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import '../publication/track_publication.dart';
|
|||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../track/local/local.dart';
|
import '../track/local/local.dart';
|
||||||
import '../track/track.dart';
|
import '../track/track.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
import 'local.dart';
|
import 'local.dart';
|
||||||
import 'remote.dart';
|
import 'remote.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import '../publication/remote.dart';
|
|||||||
import '../track/remote/audio.dart';
|
import '../track/remote/audio.dart';
|
||||||
import '../track/remote/remote.dart';
|
import '../track/remote/remote.dart';
|
||||||
import '../track/remote/video.dart';
|
import '../track/remote/video.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
import 'participant.dart';
|
import 'participant.dart';
|
||||||
|
|
||||||
/// Represents other participant in the [Room].
|
/// Represents other participant in the [Room].
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
import '../core/signal_client.dart';
|
import '../core/signal_client.dart';
|
||||||
@@ -16,7 +17,7 @@ import '../proto/livekit_rtc.pb.dart' as lk_rtc;
|
|||||||
import '../track/local/local.dart';
|
import '../track/local/local.dart';
|
||||||
import '../track/remote/remote.dart';
|
import '../track/remote/remote.dart';
|
||||||
import '../track/remote/video.dart';
|
import '../track/remote/video.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
import '../utils.dart';
|
import '../utils.dart';
|
||||||
import 'track_publication.dart';
|
import 'track_publication.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
import '../core/signal_client.dart';
|
||||||
import '../events.dart';
|
import '../events.dart';
|
||||||
import '../extensions.dart';
|
import '../extensions.dart';
|
||||||
import '../internal/events.dart';
|
import '../internal/events.dart';
|
||||||
@@ -7,10 +8,10 @@ import '../logger.dart';
|
|||||||
import '../participant/participant.dart';
|
import '../participant/participant.dart';
|
||||||
import '../proto/livekit_models.pb.dart' as lk_models;
|
import '../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../track/track.dart';
|
|
||||||
import '../track/local/local.dart';
|
import '../track/local/local.dart';
|
||||||
import '../types.dart';
|
import '../track/track.dart';
|
||||||
import '../core/signal_client.dart';
|
import '../types/other.dart';
|
||||||
|
import '../types/video_dimensions.dart';
|
||||||
|
|
||||||
/// Represents a track that's published to the server. This class contains
|
/// Represents a track that's published to the server. This class contains
|
||||||
/// metadata associated with tracks.
|
/// metadata associated with tracks.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
import '../logger.dart';
|
import '../logger.dart';
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import 'dart:async';
|
|||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
|
|
||||||
import '../../proto/livekit_models.pb.dart' as lk_models;
|
import '../../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../../types.dart';
|
import '../../types/other.dart';
|
||||||
import '../audio_management.dart';
|
import '../audio_management.dart';
|
||||||
import '../options.dart';
|
import '../options.dart';
|
||||||
import 'local.dart';
|
import 'local.dart';
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
@@ -8,7 +9,7 @@ import '../../logger.dart';
|
|||||||
import '../../participant/remote.dart';
|
import '../../participant/remote.dart';
|
||||||
import '../../proto/livekit_models.pb.dart' as lk_models;
|
import '../../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../../support/platform.dart';
|
import '../../support/platform.dart';
|
||||||
import '../../types.dart';
|
import '../../types/other.dart';
|
||||||
import '../options.dart';
|
import '../options.dart';
|
||||||
import '../remote/audio.dart';
|
import '../remote/audio.dart';
|
||||||
import '../remote/video.dart';
|
import '../remote/video.dart';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
|||||||
|
|
||||||
import '../../logger.dart';
|
import '../../logger.dart';
|
||||||
import '../../proto/livekit_models.pb.dart' as lk_models;
|
import '../../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../../types.dart';
|
import '../../types/other.dart';
|
||||||
import '../options.dart';
|
import '../options.dart';
|
||||||
import '../track.dart';
|
import '../track.dart';
|
||||||
import 'local.dart';
|
import 'local.dart';
|
||||||
|
|||||||
+4
-414
@@ -1,8 +1,6 @@
|
|||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
|
||||||
|
|
||||||
import '../track/local/audio.dart';
|
import '../track/local/audio.dart';
|
||||||
import '../track/local/video.dart';
|
import '../track/local/video.dart';
|
||||||
import '../types.dart';
|
import '../types/video_parameters.dart';
|
||||||
|
|
||||||
/// A type that represents front or back of the camera.
|
/// A type that represents front or back of the camera.
|
||||||
enum CameraPosition {
|
enum CameraPosition {
|
||||||
@@ -25,7 +23,7 @@ class CameraCaptureOptions extends VideoCaptureOptions {
|
|||||||
|
|
||||||
const CameraCaptureOptions({
|
const CameraCaptureOptions({
|
||||||
this.cameraPosition = CameraPosition.front,
|
this.cameraPosition = CameraPosition.front,
|
||||||
VideoParameters params = VideoParameters.presetQHD169,
|
VideoParameters params = VideoParametersPresets.h720_169,
|
||||||
}) : super(params: params);
|
}) : super(params: params);
|
||||||
|
|
||||||
CameraCaptureOptions.from({required VideoCaptureOptions captureOptions})
|
CameraCaptureOptions.from({required VideoCaptureOptions captureOptions})
|
||||||
@@ -53,7 +51,7 @@ class CameraCaptureOptions extends VideoCaptureOptions {
|
|||||||
/// Options used when creating a [LocalVideoTrack] that captures the screen.
|
/// Options used when creating a [LocalVideoTrack] that captures the screen.
|
||||||
class ScreenShareCaptureOptions extends VideoCaptureOptions {
|
class ScreenShareCaptureOptions extends VideoCaptureOptions {
|
||||||
const ScreenShareCaptureOptions({
|
const ScreenShareCaptureOptions({
|
||||||
VideoParameters params = VideoParameters.presetHD169,
|
VideoParameters params = VideoParametersPresets.h720_169,
|
||||||
}) : super(params: params);
|
}) : super(params: params);
|
||||||
|
|
||||||
ScreenShareCaptureOptions.from({required VideoCaptureOptions captureOptions})
|
ScreenShareCaptureOptions.from({required VideoCaptureOptions captureOptions})
|
||||||
@@ -73,7 +71,7 @@ abstract class VideoCaptureOptions extends LocalTrackOptions {
|
|||||||
final VideoParameters params;
|
final VideoParameters params;
|
||||||
|
|
||||||
const VideoCaptureOptions({
|
const VideoCaptureOptions({
|
||||||
this.params = VideoParameters.presetQHD169,
|
this.params = VideoParametersPresets.h720_169,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -81,414 +79,6 @@ abstract class VideoCaptureOptions extends LocalTrackOptions {
|
|||||||
params.toMediaConstraintsMap();
|
params.toMediaConstraintsMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A type that represents video encoding information.
|
|
||||||
class VideoEncoding {
|
|
||||||
final int maxFramerate;
|
|
||||||
final int maxBitrate;
|
|
||||||
|
|
||||||
const VideoEncoding({
|
|
||||||
required this.maxFramerate,
|
|
||||||
required this.maxBitrate,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() =>
|
|
||||||
'${runtimeType}(maxFramerate: ${maxFramerate}, maxBitrate: ${maxBitrate})';
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Convenience extension for [VideoEncoding].
|
|
||||||
extension VideoEncodingExt on VideoEncoding {
|
|
||||||
rtc.RTCRtpEncoding toRTCRtpEncoding({
|
|
||||||
String? rid,
|
|
||||||
double? scaleResolutionDownBy = 1.0,
|
|
||||||
int? numTemporalLayers,
|
|
||||||
}) =>
|
|
||||||
rtc.RTCRtpEncoding(
|
|
||||||
rid: rid,
|
|
||||||
scaleResolutionDownBy: scaleResolutionDownBy,
|
|
||||||
maxFramerate: maxFramerate,
|
|
||||||
maxBitrate: maxBitrate,
|
|
||||||
numTemporalLayers: numTemporalLayers,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
class VideoParameters {
|
|
||||||
// 16:9 Presets
|
|
||||||
static const presetH90_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h90_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 60 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
static const presetH180_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h180_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 120 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH216_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h216_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 180 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH360_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h360_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 300 * 1000,
|
|
||||||
maxFramerate: 20,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH540_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h540_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 600 * 1000,
|
|
||||||
maxFramerate: 25,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH720_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h720_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 2 * 1000 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH1080_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h1080_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 3 * 1000 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH1440_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h1440_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 5 * 1000 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH2160_169 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h2160_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 8 * 1000 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// 4:3 presets
|
|
||||||
|
|
||||||
static const presetH120_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h120_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 80 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH180_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h180_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 100 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH240_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h240_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 150 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH360_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h360_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 225 * 1000,
|
|
||||||
maxFramerate: 20,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH480_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h480_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 300 * 1000,
|
|
||||||
maxFramerate: 20,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH540_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h540_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 450 * 1000,
|
|
||||||
maxFramerate: 25,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH720_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h720_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 1 * 500 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH1080_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h1080_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 2 * 500 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetH1440_43 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h1440_43,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 3 * 500 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Screen share
|
|
||||||
|
|
||||||
static const presetScreenShareH360FPS3 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h360_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 200 * 1000,
|
|
||||||
maxFramerate: 3,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareH720FPS5 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h720_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 400 * 1000,
|
|
||||||
maxFramerate: 5,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareH720FPS15 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h720_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 1 * 1000 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareH1080FPS15 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h1080_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 1 * 500 * 1000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareH1080FPS30 = VideoParameters(
|
|
||||||
dimensions: VideoDimensions.h1080_169,
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 3 * 1000 * 1000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
final String? description;
|
|
||||||
final VideoDimensions dimensions;
|
|
||||||
final VideoEncoding encoding;
|
|
||||||
|
|
||||||
const VideoParameters({
|
|
||||||
this.description,
|
|
||||||
required this.dimensions,
|
|
||||||
required this.encoding,
|
|
||||||
});
|
|
||||||
|
|
||||||
static const presetQVGA169 = VideoParameters(
|
|
||||||
description: 'QVGA(320x180) 16:9',
|
|
||||||
dimensions: VideoDimensions(320, 180),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 120000,
|
|
||||||
maxFramerate: 10,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetVGA169 = VideoParameters(
|
|
||||||
description: 'VGA(640x360) 16:9',
|
|
||||||
dimensions: VideoDimensions(640, 360),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 300000,
|
|
||||||
maxFramerate: 20,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetQHD169 = VideoParameters(
|
|
||||||
description: 'QHD(960x540) 16:9',
|
|
||||||
dimensions: VideoDimensions(960, 540),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 600000,
|
|
||||||
maxFramerate: 25,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetHD169 = VideoParameters(
|
|
||||||
description: 'HD(1280x720) 16:9',
|
|
||||||
dimensions: VideoDimensions(1280, 720),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 2000000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetFHD169 = VideoParameters(
|
|
||||||
description: 'FHD(1920x1080) 16:9',
|
|
||||||
dimensions: VideoDimensions(1920, 1080),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 3000000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetQVGA43 = VideoParameters(
|
|
||||||
description: 'QVGA(240x180) 4:3',
|
|
||||||
dimensions: VideoDimensions(240, 180),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 90000,
|
|
||||||
maxFramerate: 10,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetVGA43 = VideoParameters(
|
|
||||||
description: 'VGA(480x360) 4:3',
|
|
||||||
dimensions: VideoDimensions(480, 360),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 225000,
|
|
||||||
maxFramerate: 20,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetQHD43 = VideoParameters(
|
|
||||||
description: 'QHD(720x540) 4:3',
|
|
||||||
dimensions: VideoDimensions(720, 540),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 450000,
|
|
||||||
maxFramerate: 25,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetHD43 = VideoParameters(
|
|
||||||
description: 'HD(960x720) 4:3',
|
|
||||||
dimensions: VideoDimensions(960, 720),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 1500000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetFHD43 = VideoParameters(
|
|
||||||
description: 'FHD(1440x1080) 4:3',
|
|
||||||
dimensions: VideoDimensions(1440, 1080),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 2800000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareVGA = VideoParameters(
|
|
||||||
description: 'ScreenShareVGA(640x360)',
|
|
||||||
dimensions: VideoDimensions(640, 360),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 200000,
|
|
||||||
maxFramerate: 3,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareHD5 = VideoParameters(
|
|
||||||
description: 'ScreenShareHD5(1280x720)',
|
|
||||||
dimensions: VideoDimensions(1280, 720),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 400000,
|
|
||||||
maxFramerate: 5,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareHD15 = VideoParameters(
|
|
||||||
description: 'ScreenShareHD15(1280x720)',
|
|
||||||
dimensions: VideoDimensions(1280, 720),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 1000000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareFHD15 = VideoParameters(
|
|
||||||
description: 'ScreenShareFHD15(1920x1080)',
|
|
||||||
dimensions: VideoDimensions(1920, 1080),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 1500000,
|
|
||||||
maxFramerate: 15,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static const presetScreenShareFHD30 = VideoParameters(
|
|
||||||
description: 'ScreenShareFHD30(1920x1080)',
|
|
||||||
dimensions: VideoDimensions(1920, 1080),
|
|
||||||
encoding: VideoEncoding(
|
|
||||||
maxBitrate: 3000000,
|
|
||||||
maxFramerate: 30,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
static final List<VideoParameters> presets169 = [
|
|
||||||
presetH90_169,
|
|
||||||
presetH180_169,
|
|
||||||
presetH216_169,
|
|
||||||
presetH360_169,
|
|
||||||
presetH540_169,
|
|
||||||
presetH720_169,
|
|
||||||
presetH1080_169,
|
|
||||||
presetH1440_169,
|
|
||||||
presetH2160_169,
|
|
||||||
];
|
|
||||||
|
|
||||||
static final List<VideoParameters> presets43 = [
|
|
||||||
presetH120_43,
|
|
||||||
presetH180_43,
|
|
||||||
presetH240_43,
|
|
||||||
presetH360_43,
|
|
||||||
presetH480_43,
|
|
||||||
presetH540_43,
|
|
||||||
presetH720_43,
|
|
||||||
presetH1080_43,
|
|
||||||
presetH1440_43,
|
|
||||||
];
|
|
||||||
|
|
||||||
static final List<VideoParameters> presetsScreenShare = [
|
|
||||||
presetScreenShareH360FPS3,
|
|
||||||
presetScreenShareH720FPS5,
|
|
||||||
presetScreenShareH720FPS15,
|
|
||||||
presetScreenShareH1080FPS15,
|
|
||||||
presetScreenShareH1080FPS30,
|
|
||||||
];
|
|
||||||
|
|
||||||
//
|
|
||||||
// TODO: Return constraints that will work for all platforms (Web & Mobile)
|
|
||||||
// https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
|
|
||||||
//
|
|
||||||
Map<String, dynamic> toMediaConstraintsMap() => <String, dynamic>{
|
|
||||||
'width': dimensions.width,
|
|
||||||
'height': dimensions.height,
|
|
||||||
'frameRate': encoding.maxFramerate,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Options used when creating a [LocalAudioTrack].
|
/// Options used when creating a [LocalAudioTrack].
|
||||||
class AudioCaptureOptions extends LocalTrackOptions {
|
class AudioCaptureOptions extends LocalTrackOptions {
|
||||||
/// Attempt to use noiseSuppression option (if supported by the platform)
|
/// Attempt to use noiseSuppression option (if supported by the platform)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
|
|
||||||
import '../../proto/livekit_models.pb.dart' as lk_models;
|
import '../../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../../types.dart';
|
import '../../types/other.dart';
|
||||||
import '../audio_management.dart';
|
import '../audio_management.dart';
|
||||||
import '../local/local.dart';
|
import '../local/local.dart';
|
||||||
import 'remote.dart';
|
import 'remote.dart';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
|
|
||||||
import '../../proto/livekit_models.pb.dart' as lk_models;
|
import '../../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../../types.dart';
|
import '../../types/other.dart';
|
||||||
import '../track.dart';
|
import '../track.dart';
|
||||||
|
|
||||||
abstract class RemoteTrack extends Track {
|
abstract class RemoteTrack extends Track {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
|
|
||||||
import '../../proto/livekit_models.pb.dart' as lk_models;
|
import '../../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../../types.dart';
|
import '../../types/other.dart';
|
||||||
import '../local/local.dart';
|
import '../local/local.dart';
|
||||||
import 'remote.dart';
|
import 'remote.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import '../logger.dart';
|
|||||||
import '../managers/event.dart';
|
import '../managers/event.dart';
|
||||||
import '../proto/livekit_models.pb.dart' as lk_models;
|
import '../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../support/disposable.dart';
|
import '../support/disposable.dart';
|
||||||
import '../types.dart';
|
import '../types/other.dart';
|
||||||
|
|
||||||
/// Wrapper around a MediaStreamTrack with additional metadata.
|
/// Wrapper around a MediaStreamTrack with additional metadata.
|
||||||
/// Base for [AudioTrack] and [VideoTrack],
|
/// Base for [AudioTrack] and [VideoTrack],
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
// ignore: avoid_web_libraries_in_flutter
|
|
||||||
|
|
||||||
import 'dart:html' as html;
|
import 'dart:html' as html;
|
||||||
|
|
||||||
// ignore: implementation_imports
|
|
||||||
import 'package:dart_webrtc/src/media_stream_track_impl.dart';
|
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
|
|
||||||
|
// ignore: implementation_imports
|
||||||
|
import 'package:dart_webrtc/src/media_stream_track_impl.dart'; // import_sorter: keep
|
||||||
|
|
||||||
const audioContainerId = 'livekit_audio_container';
|
const audioContainerId = 'livekit_audio_container';
|
||||||
const audioPrefix = 'livekit_audio_';
|
const audioPrefix = 'livekit_audio_';
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import 'dart:math' as math;
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'extensions.dart';
|
import '../extensions.dart';
|
||||||
import 'participant/participant.dart';
|
import '../participant/participant.dart';
|
||||||
|
|
||||||
typedef CancelListenFunc = Function();
|
typedef CancelListenFunc = Function();
|
||||||
|
|
||||||
@@ -142,58 +142,6 @@ class RTCIceServer {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A simple class that represents dimensions of video.
|
|
||||||
@immutable
|
|
||||||
class VideoDimensions {
|
|
||||||
// 16:9 aspect ratio presets
|
|
||||||
static const h90_169 = VideoDimensions(160, 90);
|
|
||||||
static const h180_169 = VideoDimensions(320, 180);
|
|
||||||
static const h216_169 = VideoDimensions(384, 216);
|
|
||||||
static const h360_169 = VideoDimensions(640, 360);
|
|
||||||
static const h540_169 = VideoDimensions(960, 540);
|
|
||||||
static const h720_169 = VideoDimensions(1280, 720);
|
|
||||||
static const h1080_169 = VideoDimensions(1920, 1080);
|
|
||||||
static const h1440_169 = VideoDimensions(2560, 1440);
|
|
||||||
static const h2160_169 = VideoDimensions(3840, 2160);
|
|
||||||
|
|
||||||
// 4:3 aspect ratio presets
|
|
||||||
static const h120_43 = VideoDimensions(160, 120);
|
|
||||||
static const h180_43 = VideoDimensions(240, 180);
|
|
||||||
static const h240_43 = VideoDimensions(320, 240);
|
|
||||||
static const h360_43 = VideoDimensions(480, 360);
|
|
||||||
static const h480_43 = VideoDimensions(640, 480);
|
|
||||||
static const h540_43 = VideoDimensions(720, 540);
|
|
||||||
static const h720_43 = VideoDimensions(960, 720);
|
|
||||||
static const h1080_43 = VideoDimensions(1440, 1080);
|
|
||||||
static const h1440_43 = VideoDimensions(1920, 1440);
|
|
||||||
|
|
||||||
final int width;
|
|
||||||
final int height;
|
|
||||||
|
|
||||||
const VideoDimensions(
|
|
||||||
this.width,
|
|
||||||
this.height,
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() => '${runtimeType}(${width}x${height})';
|
|
||||||
|
|
||||||
/// Returns the larger value
|
|
||||||
int max() => math.max(width, height);
|
|
||||||
|
|
||||||
/// Returns the smaller value
|
|
||||||
int min() => math.min(width, height);
|
|
||||||
|
|
||||||
VideoDimensions copyWith({
|
|
||||||
int? width,
|
|
||||||
int? height,
|
|
||||||
}) =>
|
|
||||||
VideoDimensions(
|
|
||||||
width ?? this.width,
|
|
||||||
height ?? this.height,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@immutable
|
@immutable
|
||||||
class ParticipantTrackPermission {
|
class ParticipantTrackPermission {
|
||||||
/// The participant id this permission applies to.
|
/// The participant id this permission applies to.
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
import 'dart:math' as math;
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
/// A simple class that represents dimensions of video.
|
||||||
|
@immutable
|
||||||
|
class VideoDimensions {
|
||||||
|
final int width;
|
||||||
|
final int height;
|
||||||
|
|
||||||
|
const VideoDimensions(
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => '${runtimeType}(${width}x${height})';
|
||||||
|
|
||||||
|
VideoDimensions copyWith({
|
||||||
|
int? width,
|
||||||
|
int? height,
|
||||||
|
}) =>
|
||||||
|
VideoDimensions(
|
||||||
|
width ?? this.width,
|
||||||
|
height ?? this.height,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VideoDimensionsHelpers on VideoDimensions {
|
||||||
|
/// Returns the larger value
|
||||||
|
int max() => math.max(width, height);
|
||||||
|
|
||||||
|
/// Returns the smaller value
|
||||||
|
int min() => math.min(width, height);
|
||||||
|
|
||||||
|
/// Simply returns the area
|
||||||
|
int area() => width * height;
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VideoDimensionsPresets on VideoDimensions {
|
||||||
|
// 16:9 aspect ratio presets
|
||||||
|
static const h90_169 = VideoDimensions(160, 90);
|
||||||
|
static const h180_169 = VideoDimensions(320, 180);
|
||||||
|
static const h216_169 = VideoDimensions(384, 216);
|
||||||
|
static const h360_169 = VideoDimensions(640, 360);
|
||||||
|
static const h540_169 = VideoDimensions(960, 540);
|
||||||
|
static const h720_169 = VideoDimensions(1280, 720);
|
||||||
|
static const h1080_169 = VideoDimensions(1920, 1080);
|
||||||
|
static const h1440_169 = VideoDimensions(2560, 1440);
|
||||||
|
static const h2160_169 = VideoDimensions(3840, 2160);
|
||||||
|
|
||||||
|
// 4:3 aspect ratio presets
|
||||||
|
static const h120_43 = VideoDimensions(160, 120);
|
||||||
|
static const h180_43 = VideoDimensions(240, 180);
|
||||||
|
static const h240_43 = VideoDimensions(320, 240);
|
||||||
|
static const h360_43 = VideoDimensions(480, 360);
|
||||||
|
static const h480_43 = VideoDimensions(640, 480);
|
||||||
|
static const h540_43 = VideoDimensions(720, 540);
|
||||||
|
static const h720_43 = VideoDimensions(960, 720);
|
||||||
|
static const h1080_43 = VideoDimensions(1440, 1080);
|
||||||
|
static const h1440_43 = VideoDimensions(1920, 1440);
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
/// A type that represents video encoding information.
|
||||||
|
@immutable
|
||||||
|
class VideoEncoding {
|
||||||
|
final int maxFramerate;
|
||||||
|
final int maxBitrate;
|
||||||
|
|
||||||
|
const VideoEncoding({
|
||||||
|
required this.maxFramerate,
|
||||||
|
required this.maxBitrate,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() =>
|
||||||
|
'${runtimeType}(maxFramerate: ${maxFramerate}, maxBitrate: ${maxBitrate})';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convenience extension for [VideoEncoding].
|
||||||
|
extension VideoEncodingExt on VideoEncoding {
|
||||||
|
rtc.RTCRtpEncoding toRTCRtpEncoding({
|
||||||
|
String? rid,
|
||||||
|
double? scaleResolutionDownBy = 1.0,
|
||||||
|
int? numTemporalLayers,
|
||||||
|
}) =>
|
||||||
|
rtc.RTCRtpEncoding(
|
||||||
|
rid: rid,
|
||||||
|
scaleResolutionDownBy: scaleResolutionDownBy,
|
||||||
|
maxFramerate: maxFramerate,
|
||||||
|
maxBitrate: maxBitrate,
|
||||||
|
numTemporalLayers: numTemporalLayers,
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,258 @@
|
|||||||
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
|
import 'video_dimensions.dart';
|
||||||
|
import 'video_encoding.dart';
|
||||||
|
|
||||||
|
@immutable
|
||||||
|
class VideoParameters {
|
||||||
|
final String? description;
|
||||||
|
final VideoDimensions dimensions;
|
||||||
|
final VideoEncoding encoding;
|
||||||
|
|
||||||
|
const VideoParameters({
|
||||||
|
this.description,
|
||||||
|
required this.dimensions,
|
||||||
|
required this.encoding,
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
// TODO: Return constraints that will work for all platforms (Web & Mobile)
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
|
||||||
|
//
|
||||||
|
Map<String, dynamic> toMediaConstraintsMap() => <String, dynamic>{
|
||||||
|
'width': dimensions.width,
|
||||||
|
'height': dimensions.height,
|
||||||
|
'frameRate': encoding.maxFramerate,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Comparable
|
||||||
|
// @override
|
||||||
|
// int compareTo(VideoParameters other) {
|
||||||
|
// if (this.dimensions.area() == other.dimensions.area()) {
|
||||||
|
// return encoding.compare
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VideoParametersPresets on VideoParameters {
|
||||||
|
// all 16:9 presets
|
||||||
|
static final List<VideoParameters> all169 = [
|
||||||
|
h90_169,
|
||||||
|
h180_169,
|
||||||
|
h216_169,
|
||||||
|
h360_169,
|
||||||
|
h540_169,
|
||||||
|
h720_169,
|
||||||
|
h1080_169,
|
||||||
|
h1440_169,
|
||||||
|
h2160_169,
|
||||||
|
];
|
||||||
|
|
||||||
|
// all 4:3 presets
|
||||||
|
static final List<VideoParameters> all43 = [
|
||||||
|
h120_43,
|
||||||
|
h180_43,
|
||||||
|
h240_43,
|
||||||
|
h360_43,
|
||||||
|
h480_43,
|
||||||
|
h540_43,
|
||||||
|
h720_43,
|
||||||
|
h1080_43,
|
||||||
|
h1440_43,
|
||||||
|
];
|
||||||
|
|
||||||
|
// all screen share presets
|
||||||
|
static final List<VideoParameters> allScreenShare = [
|
||||||
|
screenShareH360FPS3,
|
||||||
|
screenShareH720FPS5,
|
||||||
|
screenShareH720FPS15,
|
||||||
|
screenShareH1080FPS15,
|
||||||
|
screenShareH1080FPS30,
|
||||||
|
];
|
||||||
|
|
||||||
|
// 16:9 Presets
|
||||||
|
static const h90_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h90_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 60 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
static const h180_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h180_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 120 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h216_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h216_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 180 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h360_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h360_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 300 * 1000,
|
||||||
|
maxFramerate: 20,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h540_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h540_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 600 * 1000,
|
||||||
|
maxFramerate: 25,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h720_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h720_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 2 * 1000 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h1080_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h1080_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 3 * 1000 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h1440_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h1440_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 5 * 1000 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h2160_169 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h2160_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 8 * 1000 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// 4:3 presets
|
||||||
|
static const h120_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h120_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 80 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h180_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h180_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 100 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h240_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h240_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 150 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h360_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h360_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 225 * 1000,
|
||||||
|
maxFramerate: 20,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h480_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h480_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 300 * 1000,
|
||||||
|
maxFramerate: 20,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h540_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h540_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 450 * 1000,
|
||||||
|
maxFramerate: 25,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h720_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h720_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 1 * 500 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h1080_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h1080_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 2 * 500 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const h1440_43 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h1440_43,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 3 * 500 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Screen share
|
||||||
|
static const screenShareH360FPS3 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h360_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 200 * 1000,
|
||||||
|
maxFramerate: 3,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const screenShareH720FPS5 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h720_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 400 * 1000,
|
||||||
|
maxFramerate: 5,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const screenShareH720FPS15 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h720_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 1 * 1000 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const screenShareH1080FPS15 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h1080_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 1 * 500 * 1000,
|
||||||
|
maxFramerate: 15,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
static const screenShareH1080FPS30 = VideoParameters(
|
||||||
|
dimensions: VideoDimensionsPresets.h1080_169,
|
||||||
|
encoding: VideoEncoding(
|
||||||
|
maxBitrate: 3 * 1000 * 1000,
|
||||||
|
maxFramerate: 30,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
+9
-5
@@ -1,8 +1,9 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:device_info_plus/device_info_plus.dart';
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
@@ -14,7 +15,10 @@ import 'logger.dart';
|
|||||||
import 'options.dart';
|
import 'options.dart';
|
||||||
import 'support/platform.dart';
|
import 'support/platform.dart';
|
||||||
import 'track/options.dart';
|
import 'track/options.dart';
|
||||||
import 'types.dart';
|
import 'types/other.dart';
|
||||||
|
import 'types/video_dimensions.dart';
|
||||||
|
import 'types/video_encoding.dart';
|
||||||
|
import 'types/video_parameters.dart';
|
||||||
|
|
||||||
extension UriExt on Uri {
|
extension UriExt on Uri {
|
||||||
@internal
|
@internal
|
||||||
@@ -189,15 +193,15 @@ class Utils {
|
|||||||
required bool isScreenShare,
|
required bool isScreenShare,
|
||||||
required VideoDimensions dimensions,
|
required VideoDimensions dimensions,
|
||||||
}) {
|
}) {
|
||||||
if (isScreenShare) return VideoParameters.presetsScreenShare;
|
if (isScreenShare) return VideoParametersPresets.allScreenShare;
|
||||||
|
|
||||||
final double aspect = dimensions.width > dimensions.height
|
final double aspect = dimensions.width > dimensions.height
|
||||||
? dimensions.width / dimensions.height
|
? dimensions.width / dimensions.height
|
||||||
: dimensions.height / dimensions.width;
|
: dimensions.height / dimensions.width;
|
||||||
if ((aspect - 16.0 / 9.0).abs() < (aspect - 4.0 / 3.0).abs()) {
|
if ((aspect - 16.0 / 9.0).abs() < (aspect - 4.0 / 3.0).abs()) {
|
||||||
return VideoParameters.presets169;
|
return VideoParametersPresets.all169;
|
||||||
}
|
}
|
||||||
return VideoParameters.presets43;
|
return VideoParametersPresets.all43;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VideoEncoding _findAppropriateEncoding({
|
static VideoEncoding _findAppropriateEncoding({
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||||||
|
|
||||||
import '../events.dart';
|
import '../events.dart';
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
@Timeout(Duration(seconds: 5))
|
@Timeout(Duration(seconds: 5))
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
import 'package:livekit_client/livekit_client.dart';
|
|
||||||
|
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
|
import 'package:livekit_client/livekit_client.dart';
|
||||||
import '../mock/e2e_container.dart';
|
import '../mock/e2e_container.dart';
|
||||||
import '../mock/test_data.dart';
|
import '../mock/test_data.dart';
|
||||||
import '../mock/websocket_mock.dart';
|
import '../mock/websocket_mock.dart';
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
@Timeout(Duration(seconds: 5))
|
@Timeout(Duration(seconds: 5))
|
||||||
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:protobuf/protobuf.dart';
|
||||||
|
|
||||||
import 'package:livekit_client/livekit_client.dart';
|
import 'package:livekit_client/livekit_client.dart';
|
||||||
import 'package:livekit_client/src/core/signal_client.dart';
|
import 'package:livekit_client/src/core/signal_client.dart';
|
||||||
import 'package:livekit_client/src/internal/events.dart';
|
import 'package:livekit_client/src/internal/events.dart';
|
||||||
import 'package:livekit_client/src/proto/livekit_models.pb.dart' as lk_models;
|
import 'package:livekit_client/src/proto/livekit_models.pb.dart' as lk_models;
|
||||||
import 'package:livekit_client/src/proto/livekit_rtc.pb.dart' as lk_rtc;
|
import 'package:livekit_client/src/proto/livekit_rtc.pb.dart' as lk_rtc;
|
||||||
import 'package:protobuf/protobuf.dart';
|
|
||||||
|
|
||||||
import '../mock/test_data.dart';
|
import '../mock/test_data.dart';
|
||||||
import '../mock/websocket_mock.dart';
|
import '../mock/websocket_mock.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'package:livekit_client/livekit_client.dart';
|
import 'package:livekit_client/livekit_client.dart';
|
||||||
import 'package:livekit_client/src/core/engine.dart';
|
import 'package:livekit_client/src/core/engine.dart';
|
||||||
import 'package:livekit_client/src/core/signal_client.dart';
|
import 'package:livekit_client/src/core/signal_client.dart';
|
||||||
|
|
||||||
import '../core/signal_client_test.dart';
|
import '../core/signal_client_test.dart';
|
||||||
import 'peerconnection_mock.dart';
|
import 'peerconnection_mock.dart';
|
||||||
import 'websocket_mock.dart';
|
import 'websocket_mock.dart';
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
@Timeout(Duration(seconds: 5))
|
@Timeout(Duration(seconds: 5))
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
import 'package:livekit_client/livekit_client.dart';
|
|
||||||
|
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
|
import 'package:livekit_client/livekit_client.dart';
|
||||||
import '../core/signal_client_test.dart';
|
import '../core/signal_client_test.dart';
|
||||||
import '../mock/e2e_container.dart';
|
import '../mock/e2e_container.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
import 'package:livekit_client/src/utils.dart';
|
import 'package:livekit_client/src/utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user