You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.9 KiB
156 lines
4.9 KiB
1 year ago
|
// 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),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|