@@ -469,7 +469,21 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
469469 extensionCharacteristics = cameraManager.getCameraExtensionCharacteristics(args.cameraId)
470470 characteristics = cameraManager.getCameraCharacteristics(args.cameraId)
471471 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+
473487 if (currentExtension == - 1 ) {
474488 currentExtension = supportedExtensions[0 ]
475489 currentExtensionIdx = 0
@@ -651,6 +665,7 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
651665 previewSurface = createPreviewSurface(previewSize)
652666 stillImageReader = createStillImageReader()
653667 postviewImageReader = createPostviewImageReader()
668+ isPostviewAvailable = postviewImageReader != null
654669
655670 val outputConfig = ArrayList <OutputConfiguration >()
656671 outputConfig.add(OutputConfiguration (stillImageReader.surface))
@@ -722,14 +737,27 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
722737 * Creates the still image reader and sets up OnImageAvailableListener
723738 */
724739 private fun createStillImageReader (): ImageReader {
740+ var stillFormat: Int
741+ var stillCaptureSize: Size
742+
725743 val yuvColorEncodingSystemSizes = extensionCharacteristics.getExtensionSupportedSizes(
726744 currentExtension, ImageFormat .YUV_420_888
727745 )
728746 val jpegSizes = extensionCharacteristics.getExtensionSupportedSizes(
729747 currentExtension, ImageFormat .JPEG
730748 )
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+ }
733761 val stillImageReader = ImageReader .newInstance(
734762 stillCaptureSize.width,
735763 stillCaptureSize.height, stillFormat, 1
@@ -742,7 +770,8 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
742770 hideCaptureProgressUI()
743771 val file = File (
744772 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"
746775 )
747776 output = FileOutputStream (file)
748777 output.write(getDataFromImage(image))
@@ -787,12 +816,14 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
787816 )
788817 val postviewSize: Size
789818 val postviewFormat: Int
790- if (! jpegSupportedSizes.isEmpty ()) {
819+ if (jpegSupportedSizes.isNotEmpty ()) {
791820 postviewSize = jpegSupportedSizes[0 ]
792821 postviewFormat = ImageFormat .JPEG
793- } else {
822+ } else if (yuvSupportedSizes.isNotEmpty()) {
794823 postviewSize = yuvSupportedSizes[0 ]
795824 postviewFormat = ImageFormat .YUV_420_888
825+ } else {
826+ return null
796827 }
797828 val postviewImageReader =
798829 ImageReader .newInstance(postviewSize.width, postviewSize.height, postviewFormat, 1 )
@@ -1235,7 +1266,7 @@ class CameraFragment : Fragment(), TextureView.SurfaceTextureListener {
12351266 val planes = image.planes
12361267 var buffer: ByteBuffer
12371268 var offset = 0
1238- if (format == ImageFormat .JPEG ) {
1269+ if (format == ImageFormat .JPEG || format == ImageFormat . JPEG_R ) {
12391270 buffer = planes[0 ].buffer
12401271 data = ByteArray (buffer.limit())
12411272 buffer.rewind()
0 commit comments