@@ -469,7 +469,21 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
469
469
extensionCharacteristics = cameraManager.getCameraExtensionCharacteristics(args.cameraId)
470
470
characteristics = cameraManager.getCameraCharacteristics(args.cameraId)
471
471
lensFacing = characteristics[CameraCharacteristics .LENS_FACING ]!!
472
- supportedExtensions.addAll(extensionCharacteristics.supportedExtensions)
472
+
473
+ if (args.jpegR) {
474
+ for (extension in extensionCharacteristics.supportedExtensions) {
475
+ val jpegRSizes = extensionCharacteristics.getExtensionSupportedSizes(
476
+ extension, ImageFormat .JPEG_R
477
+ )
478
+
479
+ if (jpegRSizes.isNotEmpty()) {
480
+ supportedExtensions.add(extension)
481
+ }
482
+ }
483
+ } else {
484
+ supportedExtensions.addAll(extensionCharacteristics.supportedExtensions)
485
+ }
486
+
473
487
if (currentExtension == - 1 ) {
474
488
currentExtension = supportedExtensions[0 ]
475
489
currentExtensionIdx = 0
@@ -651,6 +665,7 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
651
665
previewSurface = createPreviewSurface(previewSize)
652
666
stillImageReader = createStillImageReader()
653
667
postviewImageReader = createPostviewImageReader()
668
+ isPostviewAvailable = postviewImageReader != null
654
669
655
670
val outputConfig = ArrayList <OutputConfiguration >()
656
671
outputConfig.add(OutputConfiguration (stillImageReader.surface))
@@ -722,14 +737,27 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
722
737
* Creates the still image reader and sets up OnImageAvailableListener
723
738
*/
724
739
private fun createStillImageReader (): ImageReader {
740
+ var stillFormat: Int
741
+ var stillCaptureSize: Size
742
+
725
743
val yuvColorEncodingSystemSizes = extensionCharacteristics.getExtensionSupportedSizes(
726
744
currentExtension, ImageFormat .YUV_420_888
727
745
)
728
746
val jpegSizes = extensionCharacteristics.getExtensionSupportedSizes(
729
747
currentExtension, ImageFormat .JPEG
730
748
)
731
- val stillFormat = if (jpegSizes.isEmpty()) ImageFormat .YUV_420_888 else ImageFormat .JPEG
732
- val stillCaptureSize = if (jpegSizes.isEmpty()) yuvColorEncodingSystemSizes[0 ] else jpegSizes[0 ]
749
+ stillFormat = if (jpegSizes.isEmpty()) ImageFormat .YUV_420_888 else ImageFormat .JPEG
750
+ stillCaptureSize = if (jpegSizes.isEmpty()) yuvColorEncodingSystemSizes[0 ] else jpegSizes[0 ]
751
+
752
+ if (Build .VERSION .SDK_INT >= 35 ) {
753
+ val jpegRSizes = extensionCharacteristics.getExtensionSupportedSizes(
754
+ currentExtension, ImageFormat .JPEG_R
755
+ )
756
+ if (args.jpegR && jpegRSizes.isNotEmpty()) {
757
+ stillFormat = ImageFormat .JPEG_R
758
+ stillCaptureSize = jpegRSizes[0 ]
759
+ }
760
+ }
733
761
val stillImageReader = ImageReader .newInstance(
734
762
stillCaptureSize.width,
735
763
stillCaptureSize.height, stillFormat, 1
@@ -742,7 +770,8 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
742
770
hideCaptureProgressUI()
743
771
val file = File (
744
772
requireActivity().getExternalFilesDir(null ),
745
- if (image.format == ImageFormat .JPEG ) " frame.jpg" else " frame.yuv"
773
+ if (image.format == ImageFormat .JPEG
774
+ || image.format == ImageFormat .JPEG_R ) " frame.jpg" else " frame.yuv"
746
775
)
747
776
output = FileOutputStream (file)
748
777
output.write(getDataFromImage(image))
@@ -787,12 +816,14 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
787
816
)
788
817
val postviewSize: Size
789
818
val postviewFormat: Int
790
- if (! jpegSupportedSizes.isEmpty ()) {
819
+ if (jpegSupportedSizes.isNotEmpty ()) {
791
820
postviewSize = jpegSupportedSizes[0 ]
792
821
postviewFormat = ImageFormat .JPEG
793
- } else {
822
+ } else if (yuvSupportedSizes.isNotEmpty()) {
794
823
postviewSize = yuvSupportedSizes[0 ]
795
824
postviewFormat = ImageFormat .YUV_420_888
825
+ } else {
826
+ return null
796
827
}
797
828
val postviewImageReader =
798
829
ImageReader .newInstance(postviewSize.width, postviewSize.height, postviewFormat, 1 )
@@ -1235,7 +1266,7 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
1235
1266
val planes = image.planes
1236
1267
var buffer: ByteBuffer
1237
1268
var offset = 0
1238
- if (format == ImageFormat .JPEG ) {
1269
+ if (format == ImageFormat .JPEG || format == ImageFormat . JPEG_R ) {
1239
1270
buffer = planes[0 ].buffer
1240
1271
data = ByteArray (buffer.limit())
1241
1272
buffer.rewind()
0 commit comments