Status Update
Comments
wu...@google.com <wu...@google.com> #2
ab...@gmail.com <ab...@gmail.com> #3
Great! Thanks a lot, I'll look for the live updates soon!
er...@google.com <er...@google.com>
tr...@google.com <tr...@google.com> #4
Hello,
I would like to get a little information here to help diagnose what's going on:
- To be clear, it looks like you might be using
CameraController
, is that right? - You say reproducibility is "Always, usually on front camera." Are you able to record a video successfully at all, or does it fail on the first attempt always on these devices?
- Does your app show a camera preview (viewfinder) in the UI? If so, does that display frames?
- Is it possible that the video is being stopped quickly after starting? If the video is stopped so quickly that the camera is not able to write any frames, you'll see the error you are getting. This is expected.
Since you are using 1.2, the video capture code is also using a legacy code path that has been improved with version 1.3. That version may resolve your issue. If you're able to take a dependency on 1.3.0-alphaXX, it may solve your problem. Otherwise we can see if there's a way to fix your issue on 1.2.
ab...@gmail.com <ab...@gmail.com> #5
thanks for quick reply.
1. I don't use CameraController.
2. First time it records on Back camera, after switch to Front camera it throws that exception and after back to Back camera it doesn't work at all. Always dosen't work on Front camera.
3. Yes, app shows camera finder. It uses case ImageAnalysis().
4. Video is not stopped at start. Seems that works correct. I have to call stop video method then it throws exception onError.
I still use cameraX 1.2 because new versions needs to change source code responsible for video but maybe there is no other way and I have to refactor code for 1.3 version.
You suggestion is to switch to 1.3.0-alphaXX? Is that stable version? Can I use it in already published app?
tr...@google.com <tr...@google.com> #6
Thanks for the response. Do you unbind all use cases before switching cameras?
I still use cameraX 1.2 because new versions needs to change source code responsible for video but maybe there is no other way and I have to refactor code for 1.3 version.
I highly recommend migrating to the camera-video
artifact. If you need help with the migration,
You suggestion is to switch to 1.3.0-alphaXX?
Since you're not using CameraController
, if you're not comfortable with using an alpha version, migrating to camera-video
version 1.2 will likely also resolve your issue. The androidx.camera.core.VideoCapture
API had some issues that were fixed with the standalone artifact, and the old API has been removed in later releases. That said, 1.3.0-alpha
also includes new compatibility fixes, so you may actually see higher overall stability across all devices.
Is that stable version?
alpha
releases are not considered stable releases, though they are still well tested and functionally stable. The alpha
designation means there may be new features added which have API signatures that may change before reaching beta
. If you stick to APIs that already existed in the previous stable release, it is much less likely you'll run into issues.
Can I use it in already published app?
You will need to update the CameraX version in your build file for your app and republish. If you're migrating to the standalone camera-video
, you'll need to change your implementation anyways, so this would be a good time to do it.
ab...@gmail.com <ab...@gmail.com> #7
tr...@google.com <tr...@google.com> #8
Thank you for the question. Glad to help! I'll close the issue.
Just to reiterate the point, you can also integrate with the new Video APIs in version 1.2 stable. If you do that first, upgrading to 1.3 will be trivial since there won't be any API changes that affect your code.
Please let us know if you run into any other issues.
ab...@gmail.com <ab...@gmail.com> #9
So actually the bug still is here. Switching to new Video API didn't help.
I tested on Samsung SM-S911B/DS (Galaxy S23), Android 13.
ab...@gmail.com <ab...@gmail.com> #10
for reported bug like mine on Huawei P40 Lite (JNY-LX1)
I switched API to 1.3.0-alpha02 but bug still exists on other devices like Samsung SM-S911B/DS (Galaxy S23).
I tested with video Quality.HIGHEST, Quality.LOWEST, Quality.FHD, Quality.SD. All failed.
Please fix it.
tr...@google.com <tr...@google.com> #11
I'm sorry you are still running into this issue on the newer API. And that issue does look similar. Interestingly, I'm not seeing the issue on the Galaxy S23 I have, though it is a slightly different model (SM-S916U).
Leo, could you take a look at this to see if it is the same issue as
ab...@gmail.com <ab...@gmail.com> #12
le...@google.com <le...@google.com> #13
Hi,
Are you able to reproduce the issue? If yes, could you attach the device log?
I also attach two test apk, no_effect.apk
and with_effect.apk
Could you help to check if these two apk can record the video? (no_effect.apk
is supposed to encounter this bug.)
To install the apk, run below command
adb install -r -t pathToApk
Test steps:
- Launch apk,
Preview
andVideoCapture
should be bound with front camera by default. (There are buttons to switch camera and change quality) - Click RECORD, wait for a second and click STOP.
There should be a toast popup to indicate the recording result. If succeed, the video will show on Photos app.
wu...@google.com <wu...@google.com>
ab...@gmail.com <ab...@gmail.com> #14
TESTED ON DEVICE
I use remote device from Samsung RTL: Samsung SM-S911B/DS (Galaxy S23), Android 13.
CAMERAX API VERSION USED BY MY APP
1.3.0-alpha02
What CameraX API version you used to build tested APKs?
I am not sure it is the problem with CameraX API 1.3.0-alpha02 I use now.
I attached 2 logs from device with launched my app.
1. logs_video_starVidRec.txt shows a moment when recording is started. From my tag: [startVideoRecording]
2. logs_202338_1450_stopVidRec_err_ERROR_NO_VALID_DATA. It shows the moment after call recording.stop(). It throws err code 8 (ERROR_NO_VALID_DATA).
I noticed something odd when call cameraProvider.getAvailableCameraInfos() and it returns 4 items, like that Samsung phone has 4 camera devices? I didn't noticed it before on my phones in the office.
Please look at attached code snippets from my app, blocks: init cases, start video and stop video rec.
I am not sure what might be wrong there.
// ------------------------- init block
ListenableFuture<ProcessCameraProvider> cameraProviderFuture =
ProcessCameraProvider.getInstance(context);
cameraProviderFuture.addListener(() -> {
Preview preview = new Preview.Builder().build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build();
recorder = new Recorder.Builder()
.setExecutor( ContextCompat.getMainExecutor(context) )
.setQualitySelector(QualitySelector.from(Quality.HIGHEST))
.build();
videoCapture = VideoCapture.withOutput(recorder);
videoCapture.setTargetRotation(rotation);
camera = cameraProvider.bindToLifecycle(
((LifecycleOwner) this),
cameraSelector,
preview,
videoCapture
);
}, ContextCompat.getMainExecutor(context));
}
// ------------------------- Record video block
final String APP_MEDIA_RELATIVE_PATH = Environment.DIRECTORY_DCIM + "/MyAppMediaFolder"
final String fileName = ImageUtils.getMediaFileNameWithExtension("video_", "mp4");
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, APP_MEDIA_RELATIVE_PATH);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
contentValues.put(MediaStore.MediaColumns.ARTIST, Utils.getAppInfo_Name(context));
MediaStoreOutputOptions outputFileOptions = new MediaStoreOutputOptions.Builder(context.getContentResolver(),
MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
.setContentValues(contentValues)
.build();
PendingRecording pendingRecording = recorder.prepareRecording(context, outputFileOptions);
recording = pendingRecording.withAudioEnabled().start(getExecutor(), new Consumer<VideoRecordEvent>() {
@SuppressLint("CheckResult")
@Override
public void accept(VideoRecordEvent videoRecordEvent ) {
...
}
}
// ------------------------- stop video block
if (recording != null) {
L.d_always(LOG, "About stop video recording");
try {
recording.stop();
//recording.close();
//recording = null;
} catch (Exception e) {
App.reportBug("CAMPR-RECVSP", e.getMessage());
L.d_always(LOG, "stop video recrding error " + e.getMessage());
}
setVideoRecordingState(false);
}
I set mime "video/mp4" but in logs I can see that Samsung phone prints 'video/avc'.
Line: "VideoConfigUtil MediaSpec contains OUTPUT_FORMAT_AUTO. Using CamcorderProfile to derive VIDEO settings [mime type: video/avc]"
ab...@gmail.com <ab...@gmail.com> #15
An event VideoRecordEvent.Status is not called. Seems video recording is broken right after start.
To check all cases I left only required content values like MediaStore.MediaColumns.DISPLAY_NAME. Removed MediaStore.MediaColumns.RELATIVE_PATH and MediaStore.MediaColumns.ARTIST and MediaStore.MediaColumns.MIME_TYPE (video/mp4). It didn't help.
Still, the issue is connected only with video recording with front camera. Capture picture works correct for both camera lens and video record for back camera works correct.
Thanks.
wu...@google.com <wu...@google.com>
le...@google.com <le...@google.com> #16
Thanks for providing these information. Will take a look.
It is weird that no_effect.apk
didn't encounter the issue. It should be similar with your implementation. Btw, I see your no_effect_video_saved_ok.JPG
which enables all 4 use cases that I do not expect you will do that. Have you tried only PREVIEW + VIDEO
on front camera? which is the default settings when launching the test app.
ab...@gmail.com <ab...@gmail.com> #17
Yes, I was surprised too that I can use all cases in the time. In my application I use only preview and video in the same time according to official documentation.
Works correct on this Samsung phone:
1. Preview + Video.
2. Preview + Capture picture + Analysis + Video.
I showed you above my code snippet responsible for video recording. Seems there is nothing what can cause that issue.
As I said I use 1.3.0-alpha02 and probably you compiled testing apps with last alpha version. Is that case?
I hope not, 1.3.0alpha4 prompts me to migrate to Kotlin. I am not ready for that yet. So probably alpha02 is the last Java CameraX version. Am I right?
You can check logs_video_starVidRec.txt file and look what happens after start video recording because seems recording is not continued correctly after start - no video events come.
Thanks guys for help.
le...@google.com <le...@google.com> #18
Binding 4 use cases is a new feature from 1.3.0-alpha04, see
As I said I use 1.3.0-alpha02 and probably you compiled testing apps with last alpha version. Is that case?
Yes, I use the latest alpha version. But there should not be significant difference between 1.3.0-alpha02 and 1.3.0-alpha04.
1.3.0alpha4 prompts me to migrate to Kotlin.
As far as I know, CameraX does not require any version to use kotlin. If yes, there should be a wanring in the release note, but I don't see that. Maybe something wrong?
le...@google.com <le...@google.com> #19
It looks like the camera service is somehow dead.
2023-03-08 14:35:53.768 30151 30228 F libc Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 30228 (binder:30151_7), pid 30151 (binder:30151_2)
2023-03-08 14:35:53.886 2292 2292 F DEBUG ***
2023-03-08 14:35:53.886 2292 2292 F DEBUG Build fingerprint: 'samsung/dm1qxeea/dm1q:13/TP1A.220624.014/S911BXXU1AWBD:user/release-keys'
2023-03-08 14:35:53.886 2292 2292 F DEBUG Revision: '8'
2023-03-08 14:35:53.886 2292 2292 F DEBUG ABI: 'arm64'
2023-03-08 14:35:53.886 2292 2292 F DEBUG Processor: '4'
2023-03-08 14:35:53.886 2292 2292 F DEBUG Timestamp: 2023-03-08 14:35:53.823436920+0100
2023-03-08 14:35:53.886 2292 2292 F DEBUG Process uptime: 0s
2023-03-08 14:35:53.886 2292 2292 F DEBUG Cmdline: /vendor/bin/hw/vendor.samsung.hardware.camera.provider-service_64
2023-03-08 14:35:53.886 2292 2292 F DEBUG pid: 30151, tid: 30228, name: binder:30151_7 >>> /vendor/bin/hw/vendor.samsung.hardware.camera.provider-service_64 <<<
2023-03-08 14:35:53.886 2292 2292 F DEBUG uid: 1047
2023-03-08 14:35:53.886 2292 2292 F DEBUG tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
2023-03-08 14:35:53.886 2292 2292 F DEBUG pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)
2023-03-08 14:35:53.886 2292 2292 F DEBUG signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
2023-03-08 14:35:53.886 2292 2292 F DEBUG Abort message: 'ubsan: sub-overflow'
2023-03-08 14:35:53.886 2292 2292 F DEBUG x0 0000000000000000 x1 0000000000007614 x2 0000000000000006 x3 0000007e8d507820
2023-03-08 14:35:53.886 2292 2292 F DEBUG x4 8000000000000000 x5 8000000000000000 x6 8000000000000000 x7 0000000000000080
2023-03-08 14:35:53.886 2292 2292 F DEBUG x8 00000000000000f0 x9 0000007f6964abf0 x10 0000000000000001 x11 0000007f696bf3ec
2023-03-08 14:35:53.886 2292 2292 F DEBUG x12 0101010101010101 x13 00000000ffffffff x14 0000007eb3f7d428 x15 0000000000000048
2023-03-08 14:35:53.886 2292 2292 F DEBUG x16 0000007f6972aa58 x17 0000007f69703120 x18 0000007e7e768000 x19 00000000000075c7
2023-03-08 14:35:53.886 2292 2292 F DEBUG x20 0000000000007614 x21 00000000ffffffff x22 b400007e7accf8c0 x23 0000007eb3f7db18
2023-03-08 14:35:53.886 2292 2292 F DEBUG x24 0000000000000001 x25 0000007edefe530c x26 0000000000000003 x27 b400007f65243bc8
2023-03-08 14:35:53.886 2292 2292 F DEBUG x28 b400007e6a021500 x29 0000007e8d5078a0
2023-03-08 14:35:53.886 2292 2292 F DEBUG lr 0000007f696b0368 sp 0000007e8d507800 pc 0000007f696b0394 pst 0000000000001000
2023-03-08 14:35:53.886 2292 2292 F DEBUG backtrace:
2023-03-08 14:35:53.886 2292 2292 F DEBUG #00 pc 000000000008d394 /apex/com.android.runtime/lib64/bionic/libc.so (abort+168) (BuildId: 1bcad8bca80d38bceb9089f70d394e33)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #01 pc 0000000000124350 /vendor/lib64/hw/com.qti.chi.override.so (__ubsan_handle_sub_overflow_minimal_abort+64) (BuildId: 15b454ec266161934078e5590d7db808)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #02 pc 0000000000466120 /vendor/lib64/hw/com.qti.chi.override.so (CHXStreamBufferManager::ThrottleCaptureRequest(camera3_capture_request*)+5088) (BuildId: 15b454ec266161934078e5590d7db808)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #03 pc 00000000003b642c /vendor/lib64/hw/com.qti.chi.override.so (ExtensionModule::OverrideProcessRequest(camera3_device const*, camera3_capture_request*, void*, int)+7628) (BuildId: 15b454ec266161934078e5590d7db808)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #04 pc 00000000007ec3b0 /vendor/lib64/hw/camera.qcom.so (CamX::HALDevice::ProcessCaptureRequest(CamX::Camera3CaptureRequest*)+1152) (BuildId: 20126e260de3a5180f8c4a02ba159e4c)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #05 pc 00000000007ca16c /vendor/lib64/hw/camera.qcom.so (CamX::process_capture_request(camera3_device const*, camera3_capture_request*) (.4b8ec8c6eef7485d1c34ffa88e9930ee.cfi)+2092) (BuildId: 20126e260de3a5180f8c4a02ba159e4c)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #06 pc 00000000000d81d4 /vendor/lib64/unihal_main.so (unihal::CameraDevice::ProcessCaptureRequest(unsigned int, unihal::UniCamera3CaptureRequest const&)+200) (BuildId: f6393c44d1fa1fe8f26e260756886252)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #07 pc 00000000000da9e8 /vendor/lib64/unihal_main.so (unihal::MultiCameraManager::ProcessCaptureRequest(unsigned int, unihal::UniCamera3CaptureRequest const&)+92) (BuildId: f6393c44d1fa1fe8f26e260756886252)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #08 pc 00000000000adf84 /vendor/lib64/unihal_main.so (unihal::CameraHalUnit::ProcessCaptureRequest(unihal::UniCamera3CaptureRequest const&)+136) (BuildId: f6393c44d1fa1fe8f26e260756886252)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #09 pc 00000000000aa7a8 /vendor/lib64/unihal_main.so (unihal::CameraHalManager::ProcessCaptureRequest(camera3_device const*, unihal::UniCamera3CaptureRequest const&)+308) (BuildId: f6393c44d1fa1fe8f26e260756886252)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #10 pc 00000000000a6790 /vendor/lib64/unihal_main.so (unihal::uni_process_capture_request(camera3_device const*, camera3_capture_request*)+164) (BuildId: f6393c44d1fa1fe8f26e260756886252)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #11 pc 000000000002d590 /vendor/lib64/libsamsungcamerahwl_impl.so (android::samsung_camera_hal::SamsungCameraDeviceSessionImpl::processOneCaptureRequest(android::samsung_camera_hal::CaptureRequest const&)+2668) (BuildId: 38e091e28227ea6f3f3e2c1f1909f6a0)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #12 pc 000000000002c9fc /vendor/lib64/libsamsungcamerahwl_impl.so (android::samsung_camera_hal::SamsungCameraDeviceSessionImpl::ProcessCaptureRequest(std::__1::vector<android::samsung_camera_hal::CaptureRequest, std::__1::allocator<android::samsung_camera_hal::CaptureRequest> > const&, std::__1::vector<android::samsung_camera_hal::BufferCache, std::__1::allocator<android::samsung_camera_hal::BufferCache> > const&, unsigned int*)+980) (BuildId: 38e091e28227ea6f3f3e2c1f1909f6a0)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #13 pc 0000000000007924 /vendor/lib64/libsamsungcamerahal.so (android::samsung_camera_hal::CameraDeviceSession::ProcessCaptureRequest(std::__1::vector<android::samsung_camera_hal::CaptureRequest, std::__1::allocator<android::samsung_camera_hal::CaptureRequest> > const&, std::__1::vector<android::samsung_camera_hal::BufferCache, std::__1::allocator<android::samsung_camera_hal::BufferCache> > const&, unsigned int*)+100) (BuildId: d4ddd43f4d1af6e7b48ddc46e54ec398)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #14 pc 0000000000014d64 /vendor/bin/hw/vendor.samsung.hardware.camera.provider-service_64 (android::hardware::camera::device::implementation::AidlCameraDeviceSession::processCaptureRequest(std::__1::vector<aidl::android::hardware::camera::device::CaptureRequest, std::__1::allocator<aidl::android::hardware::camera::device::CaptureRequest> > const&, std::__1::vector<aidl::android::hardware::camera::device::BufferCache, std::__1::allocator<aidl::android::hardware::camera::device::BufferCache> > const&, int*)+1152) (BuildId: 9135789eb7a024f432a58bea471b7974)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #15 pc 000000000001ebb0 /apex/com.android.vndk.v33/lib64/android.hardware.camera.device-V1-ndk.so (aidl::android::hardware::camera::device::_aidl_android_hardware_camera_device_ICameraDeviceSession_onTransact(AIBinder*, unsigned int, AParcel const*, AParcel*)+1000) (BuildId: ff50a8bae3fd46b73aa0c0f9d3f80854)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #16 pc 000000000000b1fc /system/lib64/libbinder_ndk.so (ABBinder::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+144) (BuildId: 6bcbd35d2f897158dbbbfc9600382c86)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #17 pc 0000000000051a1c /system/lib64/libbinder.so (android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+240) (BuildId: 8ad70f5361899d296dfa174faf8ffd1c)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #18 pc 000000000005caf4 /system/lib64/libbinder.so (android::IPCThreadState::executeCommand(int)+1036) (BuildId: 8ad70f5361899d296dfa174faf8ffd1c)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #19 pc 000000000005c61c /system/lib64/libbinder.so (android::IPCThreadState::getAndExecuteCommand()+164) (BuildId: 8ad70f5361899d296dfa174faf8ffd1c)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #20 pc 000000000005cee0 /system/lib64/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+72) (BuildId: 8ad70f5361899d296dfa174faf8ffd1c)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #21 pc 000000000008d128 /system/lib64/libbinder.so (android::PoolThread::threadLoop()+448) (BuildId: 8ad70f5361899d296dfa174faf8ffd1c)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #22 pc 0000000000013418 /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+424) (BuildId: 97f353c1a350efeb766e1e852854da85)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #23 pc 00000000000f5298 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208) (BuildId: 1bcad8bca80d38bceb9089f70d394e33)
2023-03-08 14:35:53.886 2292 2292 F DEBUG #24 pc 000000000008ebdc /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68) (BuildId: 1bcad8bca80d38bceb9089f70d394e33)
So there is no camera frame send to VideoCapture. It is probably a bug in the camera HAL and your implementation flow unfortunately hit it.
Some thoughts
-
Since
no_effect.apk
doesn't encounter this error, you should have a chance to try tweaking your implementation slightly to avoid this issue. Maybe take as a reference. (you can first check if CameraXBasic have the same issue.)CameraXBasic -
From the log, I am wondering when do you call
Preview.setSurfaceProvider()
? and how do you switch camera? (code snippet is appreciated)
Would you mind to try callingPreview.setSurfaceProvider()
earlier? such as before callingcameraProvider.bindToLifecycle()
.
ab...@gmail.com <ab...@gmail.com> #20
I am sure I put setSurfaceProvider after bindToLifecycle() according to guide for CameraX on Android developer page. It was Sep 2022. Now I checked it again and there are new examples with setSurfaceProvider after. Wrong solution is used on CameraXBasic you linked me. It should be fixed and workable version committed to avoid the issue like that.
Please don't close the ticket yet. Tomorrow I am going do a few hours tests in the office on many phones since Android 7.1 to 13 to make sure all works correct.
Seems it was not strict a bug, only some changes in implementation in meantime.
Anyway, you do great job. CameraX package is what we, Android developers have waited for years.
le...@google.com <le...@google.com> #21
Great to hear that! thanks for trying. Now I can better speculate about the cause of the problem.
Your original code is definitely using CameraX correctly, but it will start an optimization process in CameraX, which happens to run abnormally on the devices you are using.
We will try to resolve this issue.
In the mean time you can adopt the solution you are using for now since it should still be a correct usage for CameraX.
You don't need to close this bug, we will track the fix on this bug.
Thank you for feedback to make CameraX better!
ab...@gmail.com <ab...@gmail.com> #22
I will track changes about CameraX and this post in case you want to update something in the future.
ap...@google.com <ap...@google.com> #23
Branch: androidx-main
commit 3130e614ac6950af495c45fedd44a3ee042b8d01
Author: leo huang <leohuang@google.com>
Date: Mon Mar 20 13:42:50 2023
Fix MeterRepeatingSession not being removed when setting SurfaceProvider after Preview is bound.
Root cause:
The MeterRepeatingSession is not removed when Preview surface is provided. It results in a redundant camera stream to create camera capture session. The issue devices can't work normally when there are three camera streams, e.g. Preview + VideoCapture + MeteringRepeatingSession.
Solution:
Trigger `addOrRemoveMeteringRepeatingUseCase()` when attached UseCase is reset.
Relnote: "Fixed an issue where VideoCapture could not work with the front camera on some devices. For example, on Samsung Galaxy S23 and Xiaomi 2107113SG."
Bug: 273633381
Bug: 270656244
Test: Camera2CameraImplTest
Change-Id: Ibec7ea9696314f3f7ba303a2d0053c58762f72a1
M camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
M camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
le...@google.com <le...@google.com> #24
The solution is merged and will be released in 1.3.0-alpha06
.
pr...@google.com <pr...@google.com> #25
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.camera:camera-camera2:1.3.0-alpha06
ab...@gmail.com <ab...@gmail.com> #26
[Deleted User] <[Deleted User]> #27
le...@google.com <le...@google.com> #28
Hi,
Thanks for reply, we will evaluate the possibilities. Wondering if a certain number of devices were affected in your case?
[Deleted User] <[Deleted User]> #29
ab...@gmail.com <ab...@gmail.com> #30
It also worked correct on Samsung 23 (Android 12/13). Do they use new Video engine and put setSurfaceProvider() before binding lifecycle as I did? It is very crucial.
le...@google.com <le...@google.com> #31
Hi, The fix will be included in CameraX 1.2.3.
ju...@google.com <ju...@google.com> #32
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.camera:camera-camera2:1.2.3
[Deleted User] <[Deleted User]> #33
We've been testing the recent changes (CameraX upgrade). It looks good on Android 13 (Google Pixel 5 and Pixel 6 phones). But when I tried it on Samsung Galaxy Note 9 (Android 10) I wasn't able to record any video - taking photos works fine.
Every time I click the 'record video' button the camera view crashes and goes back to the 'Enter a fish' screen. Sometimes Samsung OS tries to re-open the camera automatically, but then crashes again.
See the attached recording. The crash was also registered in Crashlytics, here is the stack trace:
Fatal Exception: java.lang.AssertionError: One-time media muxer creation has already occurred for recording RecordingRecord{getOutputOptions=MediaStoreOutputOptions{fileSizeLimit=0, location=null, contentResolver=android.app.ContextImpl$ApplicationContentResolver@fa70332, collectionUri=content://media/external/video/media, contentValues=_display_name=2023-07-31-15-48-47-932 mime_type=video/mp4 relative_path=Pictures/Tournament_Photos}, getCallbackExecutor=android.os.HandlerExecutor@7c1c883, getEventListener=com.xxx.android.activity.camera.CameraKitKotlinActivity$$ExternalSyntheticLambda2@ec7a00, hasAudioEnabled=true, getRecordingId=1} at androidx.camera.video.Recorder$RecordingRecord.performOneTimeMediaMuxerCreation(Recorder.java:2785) at androidx.camera.video.Recorder.setupAndStartMediaMuxer(Recorder.java:1396) at androidx.camera.video.Recorder$2.onEncodedData(Recorder.java:1570) at androidx.camera.video.internal.encoder.EncoderImpl$MediaCodecCallback.lambda$sendEncodedData$3(EncoderImpl.java:1163) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:231) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:173) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:919)
le...@google.com <le...@google.com> #34
For
Description
Stop video recording throws exception: The file has no video key frame.
CAMERAX VERSION 1.2.0
CAMERA APPLICATION NAME AND VERSION: 13.1.00.49 for Samsung SM-S911B/DS
ANDROID OS BUILD NUMBER: 13
DEVICE NAMEs:
1. Samsung SM-S911B/DS (Galaxy S23) Android 13
2. Xiaomi 2107113SG / Android 11
3. Xiaomi 2107113SG / Android 12
DESCRIPTION:
After stop recording video in throws exception in onError callback with message: The file has no video key frame.
Usually on front camera but after exception it throws on back camera too.
LIST ANY EXPERIMENTAL FEATURES: none
STEPS TO REPRODUCE:
1.videoCapture.startRecording() // starts recording ok
2.videoCapture.stopRecording() /
3. look at onError() in VideoCapture.OnVideoSavedCallback()
OBSERVED RESULTS:
Throws exception.
EXPECTED RESULTS:
Should work correct and call method onVideoSaved()
REPRODUCIBILITY: (5 of 5, 1 of 100, etc)
Always, usually on front camera.
ADDITIONAL INFORMATION:
CODE FRAGMENTS:
final String APP_MEDIA_RELATIVE_PATH = "/MyVideos";
final String MEDIA_VIDEO_PREFIX = "video_";
final String MEDIA_EXTENSION_VIDEO_MP4 = ".mp4";
final String fileName = ImageUtils.getMediaFileNameWithExtension(MEDIA_VIDEO_PREFIX, MEDIA_EXTENSION_VIDEO_MP4);
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, APP_MEDIA_RELATIVE_PATH);
contentValues.put(MediaStore.MediaColumns.ARTIST, Utils.getAppInfo_Name(context));
outputFileOptions = new VideoCapture.OutputFileOptions.Builder(
context.getContentResolver(),
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
contentValues
).build();
videoCapture.startRecording(
outputFileOptions,
getExecutor(),
new VideoCapture.OnVideoSavedCallback() {
...
}
...
videoCapture.stopRecording(); // after that throws exception in onError()
...
private Executor getExecutor() {
return ContextCompat.getMainExecutor(context);
}