diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 02dbe8a8691c..579e4d7a78af 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.5 + +* Supports video encoding bitrate. + ## 0.7.4+1 * Fixes a `StateError` ("Bad state: No element") in `setFocusMode(FocusMode.auto)` diff --git a/packages/camera/camera_android_camerax/pubspec.yaml b/packages/camera/camera_android_camerax/pubspec.yaml index d81aa4190c7e..585ec3bb67d8 100644 --- a/packages/camera/camera_android_camerax/pubspec.yaml +++ b/packages/camera/camera_android_camerax/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android_camerax description: Android implementation of the camera plugin using the CameraX library. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_android_camerax issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.7.4+1 +version: 0.7.5 environment: sdk: ^3.12.0 diff --git a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart index 35599f486f2b..590f08678bca 100644 --- a/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart +++ b/packages/camera/camera_android_camerax/test/android_camera_camerax_test.dart @@ -5749,6 +5749,108 @@ void main() { verifyNoMoreInteractions(camera.camera); }, ); + + test( + 'createCameraWithSettings passes video bitrate to Recorder', + () async { + final camera = AndroidCameraCameraX(); + const CameraLensDirection testLensDirection = CameraLensDirection.back; + const testSensorOrientation = 90; + const testCameraDescription = CameraDescription( + name: 'cameraName', + lensDirection: testLensDirection, + sensorOrientation: testSensorOrientation, + ); + const testVideoBitrate = 5000000; + + int? capturedVideoBitrate; + + final mockProcessCameraProvider = MockProcessCameraProvider(); + final mockCamera = MockCamera(); + final mockCameraInfo = MockCameraInfo(); + + when(mockProcessCameraProvider.bindToLifecycle(any, any)) + .thenAnswer((_) async => mockCamera); + when(mockCamera.getCameraInfo()).thenAnswer((_) async => mockCameraInfo); + when(mockCameraInfo.getCameraState()) + .thenAnswer((_) async => MockLiveCameraState()); + + setUpOverridesForTestingUseCaseConfiguration(mockProcessCameraProvider); + + PigeonOverrides.recorder_new = ({ + int? aspectRatio, + int? targetVideoEncodingBitRate, + QualitySelector? qualitySelector, + }) { + capturedVideoBitrate = targetVideoEncodingBitRate; + final mockRecorder = MockRecorder(); + when(mockRecorder.getQualitySelector()) + .thenAnswer((_) async => qualitySelector ?? MockQualitySelector()); + return mockRecorder; + }; + + camera.processCameraProvider = mockProcessCameraProvider; + + await camera.createCameraWithSettings( + testCameraDescription, + const MediaSettings( + videoBitrate: testVideoBitrate, + enableAudio: true, + ), + ); + + expect(capturedVideoBitrate, equals(testVideoBitrate)); + }, + ); + + test( + 'createCameraWithSettings passes null video bitrate when not specified', + () async { + final camera = AndroidCameraCameraX(); + const CameraLensDirection testLensDirection = CameraLensDirection.back; + const testSensorOrientation = 90; + const testCameraDescription = CameraDescription( + name: 'cameraName', + lensDirection: testLensDirection, + sensorOrientation: testSensorOrientation, + ); + + int? capturedVideoBitrate; + + final mockProcessCameraProvider = MockProcessCameraProvider(); + final mockCamera = MockCamera(); + final mockCameraInfo = MockCameraInfo(); + + when(mockProcessCameraProvider.bindToLifecycle(any, any)) + .thenAnswer((_) async => mockCamera); + when(mockCamera.getCameraInfo()).thenAnswer((_) async => mockCameraInfo); + when(mockCameraInfo.getCameraState()) + .thenAnswer((_) async => MockLiveCameraState()); + + setUpOverridesForTestingUseCaseConfiguration(mockProcessCameraProvider); + + PigeonOverrides.recorder_new = ({ + int? aspectRatio, + int? targetVideoEncodingBitRate, + QualitySelector? qualitySelector, + }) { + capturedVideoBitrate = targetVideoEncodingBitRate; + final mockRecorder = MockRecorder(); + when(mockRecorder.getQualitySelector()) + .thenAnswer((_) async => qualitySelector ?? MockQualitySelector()); + return mockRecorder; + }; + + camera.processCameraProvider = mockProcessCameraProvider; + + await camera.createCameraWithSettings( + testCameraDescription, + const MediaSettings(enableAudio: true), + ); + + expect(capturedVideoBitrate, isNull); + }, + ); } class TestMeteringPoint extends MeteringPoint {