Vitaliy Zarubin
1 year ago
2 changed files with 310 additions and 0 deletions
@ -0,0 +1,155 @@ |
|||||||
|
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru> |
||||||
|
// SPDX-License-Identifier: BSD-3-Clause |
||||||
|
import 'dart:async'; |
||||||
|
import 'dart:convert'; |
||||||
|
|
||||||
|
import 'package:camera_platform_interface/camera_platform_interface.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter/services.dart'; |
||||||
|
|
||||||
|
import 'camera_aurora_method_channel.dart'; |
||||||
|
import 'camera_aurora_platform_interface.dart'; |
||||||
|
|
||||||
|
class CameraAurora extends CameraPlatform { |
||||||
|
/// Registers this class as the default instance of [CameraPlatform]. |
||||||
|
static void registerWith() { |
||||||
|
CameraPlatform.instance = CameraAurora(); |
||||||
|
} |
||||||
|
|
||||||
|
// The stream for vending frames to platform interface clients. |
||||||
|
StreamController<CameraImageData>? _frameStreamController; |
||||||
|
|
||||||
|
/// Completes with a list of available cameras. |
||||||
|
/// |
||||||
|
/// This method returns an empty list when no cameras are available. |
||||||
|
@override |
||||||
|
Future<List<CameraDescription>> availableCameras() => |
||||||
|
CameraAuroraPlatform.instance.availableCameras(); |
||||||
|
|
||||||
|
/// Creates an uninitialized camera instance and returns the cameraId. |
||||||
|
@override |
||||||
|
Future<int> createCamera( |
||||||
|
CameraDescription cameraDescription, |
||||||
|
ResolutionPreset? resolutionPreset, { |
||||||
|
bool enableAudio = false, |
||||||
|
}) { |
||||||
|
EventChannel(CameraAuroraEvents.cameraAuroraStreamedFrame.name) |
||||||
|
.receiveBroadcastStream() |
||||||
|
.listen((event) { |
||||||
|
debugPrint(event); |
||||||
|
}); |
||||||
|
return CameraAuroraPlatform.instance.createCamera(cameraDescription.name); |
||||||
|
} |
||||||
|
|
||||||
|
/// Initializes the camera on the device. |
||||||
|
/// |
||||||
|
/// [imageFormatGroup] is used to specify the image formatting used. |
||||||
|
/// On Android this defaults to ImageFormat.YUV_420_888 and applies only to the imageStream. |
||||||
|
/// On iOS this defaults to kCVPixelFormatType_32BGRA. |
||||||
|
/// On Web this parameter is currently not supported. |
||||||
|
@override |
||||||
|
Future<void> initializeCamera( |
||||||
|
int cameraId, { |
||||||
|
ImageFormatGroup imageFormatGroup = ImageFormatGroup.unknown, |
||||||
|
}) async { |
||||||
|
// init |
||||||
|
} |
||||||
|
|
||||||
|
/// Releases the resources of this camera. |
||||||
|
@override |
||||||
|
Future<void> dispose(int cameraId) { |
||||||
|
return CameraAuroraPlatform.instance.dispose(cameraId); |
||||||
|
} |
||||||
|
|
||||||
|
/// Captures an image and returns the file where it was saved. |
||||||
|
@override |
||||||
|
Future<XFile> takePicture(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.takePicture(cameraId); |
||||||
|
|
||||||
|
/// Starts a video recording. |
||||||
|
/// |
||||||
|
/// The length of the recording can be limited by specifying the [maxVideoDuration]. |
||||||
|
/// By default no maximum duration is specified, |
||||||
|
/// meaning the recording will continue until manually stopped. |
||||||
|
/// With [maxVideoDuration] set the video is returned in a [VideoRecordedEvent] |
||||||
|
/// through the [onVideoRecordedEvent] stream when the set duration is reached. |
||||||
|
/// |
||||||
|
/// This method is deprecated in favour of [startVideoCapturing]. |
||||||
|
@override |
||||||
|
Future<void> startVideoRecording(int cameraId, |
||||||
|
{Duration? maxVideoDuration}) => |
||||||
|
CameraAuroraPlatform.instance.startVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// Stops the video recording and returns the file where it was saved. |
||||||
|
@override |
||||||
|
Future<XFile> stopVideoRecording(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.stopVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// Pause video recording. |
||||||
|
@override |
||||||
|
Future<void> pauseVideoRecording(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.pauseVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// Resume video recording after pausing. |
||||||
|
@override |
||||||
|
Future<void> resumeVideoRecording(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.resumeVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// The ui orientation changed. |
||||||
|
/// |
||||||
|
/// Implementations for this: |
||||||
|
/// - Should support all 4 orientations. |
||||||
|
@override |
||||||
|
Stream<DeviceOrientationChangedEvent> onDeviceOrientationChanged() async* { |
||||||
|
yield const DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); |
||||||
|
} |
||||||
|
|
||||||
|
/// The camera has been initialized. |
||||||
|
@override |
||||||
|
Stream<CameraInitializedEvent> onCameraInitialized(int cameraId) async* { |
||||||
|
yield CameraInitializedEvent( |
||||||
|
cameraId, |
||||||
|
// previewWidth |
||||||
|
400, |
||||||
|
// previewHeight |
||||||
|
400, |
||||||
|
// exposureMode |
||||||
|
ExposureMode.auto, |
||||||
|
// exposurePointSupported |
||||||
|
true, |
||||||
|
// focusMode |
||||||
|
FocusMode.auto, |
||||||
|
// focusPointSupported |
||||||
|
true, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
Stream<CameraImageData> onStreamedFrameAvailable( |
||||||
|
int cameraId, { |
||||||
|
CameraImageStreamOptions? options, |
||||||
|
}) { |
||||||
|
_frameStreamController = StreamController<CameraImageData>( |
||||||
|
onListen: () => |
||||||
|
CameraAuroraPlatform.instance.streamedFrame(cameraId).listen((data) { |
||||||
|
_frameStreamController!.add(data); |
||||||
|
}), |
||||||
|
onPause: () => {}, |
||||||
|
onResume: () => {}, |
||||||
|
onCancel: () => {}, |
||||||
|
); |
||||||
|
return _frameStreamController!.stream; |
||||||
|
} |
||||||
|
|
||||||
|
/// Returns a widget showing a live camera preview. |
||||||
|
@override |
||||||
|
Widget buildPreview(int cameraId) { |
||||||
|
return Center( |
||||||
|
child: Text( |
||||||
|
'Camera: $cameraId', |
||||||
|
style: |
||||||
|
const TextStyle(fontWeight: FontWeight.bold, color: Colors.white), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,155 @@ |
|||||||
|
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru> |
||||||
|
// SPDX-License-Identifier: BSD-3-Clause |
||||||
|
import 'dart:async'; |
||||||
|
import 'dart:convert'; |
||||||
|
|
||||||
|
import 'package:camera_platform_interface/camera_platform_interface.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter/services.dart'; |
||||||
|
|
||||||
|
import 'camera_aurora_method_channel.dart'; |
||||||
|
import 'camera_aurora_platform_interface.dart'; |
||||||
|
|
||||||
|
class CameraAurora extends CameraPlatform { |
||||||
|
/// Registers this class as the default instance of [CameraPlatform]. |
||||||
|
static void registerWith() { |
||||||
|
CameraPlatform.instance = CameraAurora(); |
||||||
|
} |
||||||
|
|
||||||
|
// The stream for vending frames to platform interface clients. |
||||||
|
StreamController<CameraImageData>? _frameStreamController; |
||||||
|
|
||||||
|
/// Completes with a list of available cameras. |
||||||
|
/// |
||||||
|
/// This method returns an empty list when no cameras are available. |
||||||
|
@override |
||||||
|
Future<List<CameraDescription>> availableCameras() => |
||||||
|
CameraAuroraPlatform.instance.availableCameras(); |
||||||
|
|
||||||
|
/// Creates an uninitialized camera instance and returns the cameraId. |
||||||
|
@override |
||||||
|
Future<int> createCamera( |
||||||
|
CameraDescription cameraDescription, |
||||||
|
ResolutionPreset? resolutionPreset, { |
||||||
|
bool enableAudio = false, |
||||||
|
}) { |
||||||
|
EventChannel(CameraAuroraEvents.cameraAuroraStreamedFrame.name) |
||||||
|
.receiveBroadcastStream() |
||||||
|
.listen((event) { |
||||||
|
debugPrint(event); |
||||||
|
}); |
||||||
|
return CameraAuroraPlatform.instance.createCamera(cameraDescription.name); |
||||||
|
} |
||||||
|
|
||||||
|
/// Initializes the camera on the device. |
||||||
|
/// |
||||||
|
/// [imageFormatGroup] is used to specify the image formatting used. |
||||||
|
/// On Android this defaults to ImageFormat.YUV_420_888 and applies only to the imageStream. |
||||||
|
/// On iOS this defaults to kCVPixelFormatType_32BGRA. |
||||||
|
/// On Web this parameter is currently not supported. |
||||||
|
@override |
||||||
|
Future<void> initializeCamera( |
||||||
|
int cameraId, { |
||||||
|
ImageFormatGroup imageFormatGroup = ImageFormatGroup.unknown, |
||||||
|
}) async { |
||||||
|
// init |
||||||
|
} |
||||||
|
|
||||||
|
/// Releases the resources of this camera. |
||||||
|
@override |
||||||
|
Future<void> dispose(int cameraId) { |
||||||
|
return CameraAuroraPlatform.instance.dispose(cameraId); |
||||||
|
} |
||||||
|
|
||||||
|
/// Captures an image and returns the file where it was saved. |
||||||
|
@override |
||||||
|
Future<XFile> takePicture(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.takePicture(cameraId); |
||||||
|
|
||||||
|
/// Starts a video recording. |
||||||
|
/// |
||||||
|
/// The length of the recording can be limited by specifying the [maxVideoDuration]. |
||||||
|
/// By default no maximum duration is specified, |
||||||
|
/// meaning the recording will continue until manually stopped. |
||||||
|
/// With [maxVideoDuration] set the video is returned in a [VideoRecordedEvent] |
||||||
|
/// through the [onVideoRecordedEvent] stream when the set duration is reached. |
||||||
|
/// |
||||||
|
/// This method is deprecated in favour of [startVideoCapturing]. |
||||||
|
@override |
||||||
|
Future<void> startVideoRecording(int cameraId, |
||||||
|
{Duration? maxVideoDuration}) => |
||||||
|
CameraAuroraPlatform.instance.startVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// Stops the video recording and returns the file where it was saved. |
||||||
|
@override |
||||||
|
Future<XFile> stopVideoRecording(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.stopVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// Pause video recording. |
||||||
|
@override |
||||||
|
Future<void> pauseVideoRecording(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.pauseVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// Resume video recording after pausing. |
||||||
|
@override |
||||||
|
Future<void> resumeVideoRecording(int cameraId) => |
||||||
|
CameraAuroraPlatform.instance.resumeVideoRecording(cameraId); |
||||||
|
|
||||||
|
/// The ui orientation changed. |
||||||
|
/// |
||||||
|
/// Implementations for this: |
||||||
|
/// - Should support all 4 orientations. |
||||||
|
@override |
||||||
|
Stream<DeviceOrientationChangedEvent> onDeviceOrientationChanged() async* { |
||||||
|
yield const DeviceOrientationChangedEvent(DeviceOrientation.portraitUp); |
||||||
|
} |
||||||
|
|
||||||
|
/// The camera has been initialized. |
||||||
|
@override |
||||||
|
Stream<CameraInitializedEvent> onCameraInitialized(int cameraId) async* { |
||||||
|
yield CameraInitializedEvent( |
||||||
|
cameraId, |
||||||
|
// previewWidth |
||||||
|
400, |
||||||
|
// previewHeight |
||||||
|
400, |
||||||
|
// exposureMode |
||||||
|
ExposureMode.auto, |
||||||
|
// exposurePointSupported |
||||||
|
true, |
||||||
|
// focusMode |
||||||
|
FocusMode.auto, |
||||||
|
// focusPointSupported |
||||||
|
true, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
Stream<CameraImageData> onStreamedFrameAvailable( |
||||||
|
int cameraId, { |
||||||
|
CameraImageStreamOptions? options, |
||||||
|
}) { |
||||||
|
_frameStreamController = StreamController<CameraImageData>( |
||||||
|
onListen: () => |
||||||
|
CameraAuroraPlatform.instance.streamedFrame(cameraId).listen((data) { |
||||||
|
_frameStreamController!.add(data); |
||||||
|
}), |
||||||
|
onPause: () => {}, |
||||||
|
onResume: () => {}, |
||||||
|
onCancel: () => {}, |
||||||
|
); |
||||||
|
return _frameStreamController!.stream; |
||||||
|
} |
||||||
|
|
||||||
|
/// Returns a widget showing a live camera preview. |
||||||
|
@override |
||||||
|
Widget buildPreview(int cameraId) { |
||||||
|
return Center( |
||||||
|
child: Text( |
||||||
|
'Camera: $cameraId', |
||||||
|
style: |
||||||
|
const TextStyle(fontWeight: FontWeight.bold, color: Colors.white), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue