Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 60 additions & 3 deletions app/src/main/java/app/grapheneos/camera/CamConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.util.Log
import android.util.Range
import android.util.Size
import android.view.MotionEvent
import android.view.View
Expand Down Expand Up @@ -40,6 +41,7 @@ import androidx.core.content.ContextCompat
import app.grapheneos.camera.analyzer.QRAnalyzer
import app.grapheneos.camera.ktx.markAs16by9Layout
import app.grapheneos.camera.ktx.markAs4by3Layout
import app.grapheneos.camera.ui.SettingsDialog
import app.grapheneos.camera.ui.activities.CaptureActivity
import app.grapheneos.camera.ui.activities.MainActivity
import app.grapheneos.camera.ui.activities.MoreSettings
Expand Down Expand Up @@ -86,6 +88,7 @@ class CamConfig(private val mActivity: MainActivity) {
const val EMPHASIS_ON_QUALITY = "emphasis_on_quality"
const val FOCUS_TIMEOUT = "focus_timeout"
const val VIDEO_QUALITY = "video_quality"
const val VIDEO_FRAME_RATE = "video_frame_rate"
const val ASPECT_RATIO = "aspect_ratio"
const val INCLUDE_AUDIO = "include_audio"
const val ENABLE_EIS = "enable_eis"
Expand Down Expand Up @@ -124,6 +127,8 @@ class CamConfig(private val mActivity: MainActivity) {

val VIDEO_QUALITY = Quality.HIGHEST

val VIDEO_FRAME_RATE = Range<Int>(30, 30)

const val SELF_ILLUMINATION = false

const val GEO_TAGGING = false
Expand Down Expand Up @@ -328,7 +333,7 @@ class CamConfig(private val mActivity: MainActivity) {
var videoQuality: Quality = SettingValues.Default.VIDEO_QUALITY
get() {
return if (modePref.contains(videoQualityKey)) {
mActivity.settingsDialog.titleToQuality(
SettingsDialog.titleToQuality(
modePref.getString(videoQualityKey, "")!!
)
} else {
Expand Down Expand Up @@ -357,6 +362,43 @@ class CamConfig(private val mActivity: MainActivity) {
return "${SettingValues.Key.VIDEO_QUALITY}_$pf"
}

var videoFrameRate: Range<Int> = SettingValues.Default.VIDEO_FRAME_RATE
get() {
return if (modePref.contains(videoFrameRateKey)) {
SettingsDialog.titleToFrameRateRange(
modePref.getString(videoFrameRateKey, "")!!
)
} else {
defaultVideoFrameRate
}
}
set(value) {
modePref.edit {
putString(videoFrameRateKey, mActivity.settingsDialog.getTitleForFrameRateRange(value))
}

field = value
}

val videoFrameRateKey : String
get() {
val pf = if (lensFacing == CameraSelector.LENS_FACING_FRONT) {
"FRONT"
} else {
"BACK"
}

return "${SettingValues.Key.VIDEO_FRAME_RATE}_$pf"
}

val defaultVideoFrameRate : Range<Int>
get() {
val availableFrameRates = getAvailableVideoFrameRates()
if (availableFrameRates.contains(SettingValues.Default.VIDEO_FRAME_RATE))
return SettingValues.Default.VIDEO_FRAME_RATE
return availableFrameRates[0]
}

var flashMode: Int
get() = if (imageCapture != null) imageCapture!!.flashMode else
SettingValues.Default.FLASH_MODE
Expand Down Expand Up @@ -711,7 +753,7 @@ class CamConfig(private val mActivity: MainActivity) {
}

if (isVideoMode) {
mActivity.settingsDialog.reloadQualities()
mActivity.settingsDialog.reloadVideoSettings()
}

if (lensFacing == CameraSelector.LENS_FACING_FRONT) {
Expand Down Expand Up @@ -751,7 +793,7 @@ class CamConfig(private val mActivity: MainActivity) {
editor.putBoolean(SettingValues.Key.CAMERA_SOUNDS, SettingValues.Default.CAMERA_SOUNDS)
}

// Note: This is a workaround to keep save image/video as previewed 'on' by
// Note: This is a workaround to keep save image/video as previewed 'on' by
// default starting from v73 and 'off' by default for versions before that
//
// If its not a fresh install (before v73)
Expand Down Expand Up @@ -957,6 +999,19 @@ class CamConfig(private val mActivity: MainActivity) {
return cameraProvider!!.getCameraInfo(cameraSelector)
}

fun getAvailableVideoFrameRates(): List<Range<Int>> {
val resSet = getCurrentCameraInfo().supportedFrameRateRanges

// Individual fps -> Ranged fps (sorted by lower value of range and then upper for each lower value)
val resList = resSet.sortedWith(compareBy<Range<Int>> { it.lower != it.upper }.thenBy { it.lower }.thenBy { it.upper })

// If the supportedFrameRateRange list is somehow empty due to device/library implementation
// go with the most likely default rate
if (resList.isEmpty()) return listOf(SettingValues.Default.VIDEO_FRAME_RATE)

return resList
}

fun toggleCameraSelector() {

// Manually switch to the opposite lens facing
Expand Down Expand Up @@ -1157,6 +1212,8 @@ class CamConfig(private val mActivity: MainActivity) {
if (mActivity.camConfig.saveVideoAsPreviewed)
videoCaptureBuilder.setMirrorMode(MirrorMode.MIRROR_MODE_ON_FRONT_ONLY)

videoCaptureBuilder.setTargetFrameRate(mActivity.camConfig.videoFrameRate)

videoCapture = videoCaptureBuilder.build()

useCaseGroupBuilder.addUseCase(videoCapture!!)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ class VideoCapturer(private val mActivity: MainActivity) {
animator.start()

mActivity.settingsDialog.videoQualitySpinner.isEnabled = false
mActivity.settingsDialog.videoFrameRateSpinner.isEnabled = false
mActivity.settingsDialog.enableEISToggle.isEnabled = false

mActivity.flipCamIcon.setImageResource(R.drawable.pause)
Expand Down Expand Up @@ -331,6 +332,7 @@ class VideoCapturer(private val mActivity: MainActivity) {
mActivity.flipCamIcon.setImageResource(R.drawable.flip_camera)

mActivity.settingsDialog.videoQualitySpinner.isEnabled = true
mActivity.settingsDialog.videoFrameRateSpinner.isEnabled = true
mActivity.settingsDialog.enableEISToggle.isEnabled = true

if (mActivity !is VideoCaptureActivity) {
Expand Down
Loading