Skip to content

Commit de8b235

Browse files
authored
Merge pull request #584 from r-dhanjal/jpegr_capture_sample
Add JPEG_R capture to extension sample camera app
2 parents ab6f960 + 3618590 commit de8b235

File tree

3 files changed

+61
-10
lines changed

3 files changed

+61
-10
lines changed

Camera2Extensions/app/src/main/java/com/example/android/camera2/extensions/fragments/CameraFragment.kt

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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()

Camera2Extensions/app/src/main/java/com/example/android/camera2/extensions/fragments/SelectorFragment.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ package com.example.android.camera2.extensions.fragments
1818

1919
import android.annotation.SuppressLint
2020
import android.content.Context
21+
import android.graphics.ImageFormat;
2122
import android.hardware.camera2.CameraCharacteristics
2223
import android.hardware.camera2.CameraManager
24+
import android.os.Build
2325
import android.os.Bundle
2426
import android.view.LayoutInflater
2527
import android.view.View
@@ -61,7 +63,7 @@ class SelectorFragment : Fragment() {
6163
view.setOnClickListener {
6264
Navigation.findNavController(requireActivity(), R.id.fragment_container)
6365
.navigate(SelectorFragmentDirections.actionSelectorToCamera(
64-
item.cameraId))
66+
item.cameraId, item.jpegR))
6567
}
6668
}
6769
}
@@ -71,7 +73,8 @@ class SelectorFragment : Fragment() {
7173

7274
private data class CameraInfo(
7375
val name: String,
74-
val cameraId: String)
76+
val cameraId: String,
77+
val jpegR: Boolean = false)
7578

7679
/** Converts a lens orientation enum into a human-readable string */
7780
private fun lensOrientationString(value: Int) = when (value) {
@@ -99,9 +102,21 @@ class SelectorFragment : Fragment() {
99102
.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) &&
100103
extensionCharacteristics.supportedExtensions.isNotEmpty()) {
101104
availableCameras.add(CameraInfo("$orientation ($id)", id))
105+
106+
if (Build.VERSION.SDK_INT >= 35) {
107+
for (extension in extensionCharacteristics.supportedExtensions) {
108+
val jpegRSizes = extensionCharacteristics.getExtensionSupportedSizes(
109+
extension, ImageFormat.JPEG_R
110+
)
111+
112+
if (jpegRSizes.isNotEmpty()) {
113+
availableCameras.add(CameraInfo("$orientation ($id) JPEG_R", id, true))
114+
break // Exit the loop since we found a suitable extension
115+
}
116+
}
117+
}
102118
}
103119
}
104-
105120
return availableCameras
106121
}
107122
}

Camera2Extensions/app/src/main/res/navigation/nav_graph.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@
4343
app:argType="string"
4444
app:nullable="false"/>
4545

46+
<argument
47+
android:name="jpegR"
48+
app:argType="boolean"
49+
app:nullable="false"/>
50+
4651
</fragment>
4752

4853
</navigation>

0 commit comments

Comments
 (0)