Native plugin owning AVCaptureSession + AVAssetWriter, mirroring
telegram-iOS's Camera module decomposition. Photo + video capture with
the writer-track transform set from a per-call orientation snapshot
(the three-way preview/capture/device split that camera_avfoundation
can't give us).
Modules:
CameraPlugin channels + per-handle instance map
CameraInstance session + texture + outputs + recorder
CameraSession AVCaptureSession + runtime-error/interrupt obs
CaptureDevice front/back discovery, per-device config
PhotoOutput AVCapturePhotoOutput, per-shot orientation
VideoRecorder AVAssetWriter, lazy inputs, pending-audio queue,
stop()/cancel() pair (matches telegram)
PreviewSink CVPixelBuffer → FlutterTexture
AudioSession setCategory + setActive(true) (only-widen)
DeviceOrientationBridge
Recorder details:
- Lazy videoInput/audioInput on first sample, sourceFormatHint:.
- Audio settings derived from CMAudioFormatDescriptionGet*
+ recommendedAudioSettingsForAssetWriter, gated startWriting.
- Stop sets stopSampleTime; next sample crossing it triggers
maybeFinish → finishWriting. No watchdog — telegram pattern.
- cancel() drops pending audio + cancelWriting + deletes file,
used by CameraInstance.dispose when teardown finds in-flight
recording.
- Diagnostic stream → ux/camera/events {event: "diagnostic"}.
Dart surface extensions over Phase 1:
- UxCameraValue.audioPermissionGranted
- UxCameraController.refreshAudioPermission()
- Static UxCameraController.audioPermissionGranted() /
openSystemSettings()
- UxCameraDiagnostic event variant
- FakeUxCameraBackend.{emitDiagnostic, audioPermission,
openSettingsCalls}
Tests: 32/32 in test/camera (controller + channel) green.
25 lines
992 B
Dart
25 lines
992 B
Dart
/// Flutter toolkit for fluid, native-feeling UIs.
|
|
///
|
|
/// Includes [UxKeyboard] for frame-accurate keyboard height tracking,
|
|
/// [BendBox] for curved layout painting, and bezier curve utilities.
|
|
library;
|
|
|
|
export 'src/app_info.dart';
|
|
export 'src/bend_box.dart';
|
|
export 'src/json_extension.dart';
|
|
export 'src/bezier.dart';
|
|
export 'src/camera/camera.dart';
|
|
export 'src/camera/camera_backend.dart' show UxCameraBackend, UxCameraCreateResult, UxCameraEvent, UxCameraDeviceOrientationChanged, UxCameraSessionError, UxCameraSessionInterrupted, UxCameraSessionResumed, UxCameraDiagnostic;
|
|
export 'src/camera/camera_channel.dart' show MethodChannelUxCameraBackend;
|
|
export 'src/camera/camera_preview.dart';
|
|
export 'src/clipboard.dart';
|
|
export 'src/file.dart';
|
|
export 'src/gallery.dart';
|
|
export 'src/keyboard.dart';
|
|
export 'src/auto_map.dart';
|
|
export 'src/scanner.dart';
|
|
export 'src/sensor.dart';
|
|
export 'src/functional.dart';
|
|
export 'src/crash.dart';
|
|
export 'src/log.dart';
|
|
export 'src/log_http.dart'; |