Skip to content
Merged
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
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ android {
applicationId = "compress.joshattic.us"
minSdk = 24
targetSdk = 36
versionCode = 16
versionName = "1.5.1"
versionCode = 17
versionName = "1.5.1 (Experimental, google-pixel-10-fix branch)"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
48 changes: 42 additions & 6 deletions app/src/main/java/compress/joshattic/us/CompressorViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,14 @@ data class CompressorUiState(
val totalSavedBytes: Long = 0L,

val supportedCodecs: List<String> = emptyList(),
val appInfoVersion: String = "1.5.1",
val appInfoVersion: String = "1.5.1 (Experimental, google-pixel-10-fix branch)",
val showBitrate: Boolean = false,
val useMbps: Boolean = false,
val hasShared: Boolean = false,
val removeAudio: Boolean = false,
val audioBitrate: Int = 128_000,
val audioVolume: Float = 1.0f
val audioVolume: Float = 1.0f,
val warnings: List<String> = emptyList()
) {
private val minBitrate: Long
get() {
Expand Down Expand Up @@ -660,7 +661,7 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
val currentState = _uiState.value
val inputUri = currentState.selectedUri ?: return

_uiState.update { it.copy(isCompressing = true, progress = 0f, currentOutputSize = 0L, error = null, errorLog = null, compressedUri = null, saveSuccess = false) }
_uiState.update { it.copy(isCompressing = true, progress = 0f, currentOutputSize = 0L, error = null, errorLog = null, compressedUri = null, saveSuccess = false, warnings = emptyList()) }

val outputDir = File(context.cacheDir, "compressed_videos")
outputDir.mkdirs()
Expand Down Expand Up @@ -692,7 +693,7 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
)
.build()

val transformer = Transformer.Builder(context)
val transformerBuilder = Transformer.Builder(context)
.setVideoMimeType(videoMimeType)
.setEncoderFactory(encoderFactory)
.addListener(object : Transformer.Listener {
Expand Down Expand Up @@ -739,7 +740,8 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
}
}
})
.build()

val transformer = transformerBuilder.build()

activeTransformer = transformer

Expand Down Expand Up @@ -769,9 +771,25 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
.setRemoveAudio(currentState.removeAudio)
.build()

var hdrMode = Composition.HDR_MODE_KEEP_HDR
// this is certainly a workaround ever, a workaround so horrific, it would be enough to stop me from getting through the pearly gates
// also google's fault, womp womp, can google stop being absolute garbage at anything related to the gpus
// me, a pixel 8 pro user, laughing at pixel 10 users because the gpu on the tensor g5 is 56% slower than the g3 :skull:
if (Build.MANUFACTURER.equals("Google", ignoreCase = true) && Build.MODEL.contains("Pixel 10")) {
if (videoMimeType == MimeTypes.VIDEO_H265 || videoMimeType == MimeTypes.VIDEO_H264) {
if (isHdr(context, inputUri)) {
hdrMode = Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL
val warningMsg = getApplication<Application>().getString(R.string.warning_hdr_tone_mapped)
_uiState.update { it.copy(warnings = listOf(warningMsg)) }
}
}
}

val composition = Composition.Builder(
listOf(EditedMediaItemSequence(editedMediaItem))
).build()
)
.setHdrMode(hdrMode)
.build()

transformer.start(composition, outputPath)

Expand Down Expand Up @@ -809,6 +827,24 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
return 0
}

private fun isHdr(context: Context, uri: Uri): Boolean {
val retriever = android.media.MediaMetadataRetriever()
try {
retriever.setDataSource(context, uri)
// METADATA_KEY_COLOR_TRANSFER (36) is available on API 24+
if (Build.VERSION.SDK_INT >= 24) {
val transfer = retriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER)
// 6 = ST2084 (PQ), 7 = HLG
return transfer == "6" || transfer == "7"
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
try { retriever.release() } catch(e: Exception) {}
}
return false
}

fun saveToUri(context: Context, targetUri: Uri) {
val currentState = _uiState.value
val compressedUri = currentState.compressedUri ?: return
Expand Down
38 changes: 38 additions & 0 deletions app/src/main/java/compress/joshattic/us/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,44 @@ fun ResultScreen(
fontWeight = FontWeight.Bold
)
}

if (state.warnings.isNotEmpty()) {
Spacer(modifier = Modifier.height(16.dp))
var showWarningDialog by remember { mutableStateOf(false) }

OutlinedButton(
onClick = { showWarningDialog = true },
colors = ButtonDefaults.outlinedButtonColors(
contentColor = MaterialTheme.colorScheme.error
),
border = BorderStroke(1.dp, MaterialTheme.colorScheme.error)
) {
Icon(Icons.Outlined.Warning, contentDescription = null)
Spacer(modifier = Modifier.width(8.dp))
Text("${state.warnings.size} Warning${if (state.warnings.size > 1) "s" else ""} - Tap for Details")
}

if (showWarningDialog) {
AlertDialog(
onDismissRequest = { showWarningDialog = false },
icon = { Icon(Icons.Outlined.Warning, contentDescription = null, tint = MaterialTheme.colorScheme.error) },
title = { Text(stringResource(R.string.warning_details)) },
text = {
Column {
state.warnings.forEach { warning ->
Text("• $warning", style = MaterialTheme.typography.bodyMedium)
Spacer(modifier = Modifier.height(8.dp))
}
}
},
confirmButton = {
TextButton(onClick = { showWarningDialog = false }) {
Text(stringResource(R.string.dismiss))
}
}
)
}
}

Spacer(modifier = Modifier.height(48.dp))

Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,9 @@
<string name="error_details">Fehlerdetails</string>
<string name="copy_logs">Protokolle kopieren</string>
<string name="open_issue_tracker">Issue Tracker öffnen</string>

<string name="warning_hdr_tone_mapped">HDR-Video wurde in SDR umgewandelt, um Encoder-Kompatibilitätsprobleme auf diesem Gerät zu vermeiden. Verwenden Sie AV1, wenn Sie HDR beibehalten möchten.</string>
<string name="warning_details">Warnungsdetails</string>
<string name="dismiss">Schließen</string>

</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,9 @@
<string name="error_details">Detalles del Error</string>
<string name="copy_logs">Copiar Registros</string>
<string name="open_issue_tracker">Abrir Rastreador de Problemas</string>

<string name="warning_hdr_tone_mapped">El video HDR se convirtió a SDR para evitar problemas de compatibilidad del codificador en este dispositivo. Usa AV1 si necesitas mantener HDR.</string>
<string name="warning_details">Detalles de advertencia</string>
<string name="dismiss">Descartar</string>

</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-ja/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,9 @@
<string name="error_details">エラーの詳細</string>
<string name="copy_logs">ログをコピー</string>
<string name="open_issue_tracker">課題トラッカーを開く</string>

<string name="warning_hdr_tone_mapped">このデバイスでのエンコーダー互換性の問題を回避するため、HDRビデオはSDRにトーンマッピングされました。HDRを維持する必要がある場合は、AV1を使用してください。</string>
<string name="warning_details">警告の詳細</string>
<string name="dismiss">閉じる</string>

</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-ko/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,9 @@
<string name="error_details">오류 세부 정보</string>
<string name="copy_logs">로그 복사</string>
<string name="open_issue_tracker">이슈 트래커 열기</string>

<string name="warning_hdr_tone_mapped">이 장치에서 인코더 호환성 문제를 방지하기 위해 HDR 비디오가 SDR로 톤 매핑되었습니다. HDR을 보존하려면 AV1을 사용하십시오.</string>
<string name="warning_details">경고 세부 정보</string>
<string name="dismiss">닫기</string>

</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-pt-rBR/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,9 @@
<string name="error_details">Detalhes do Erro</string>
<string name="copy_logs">Copiar Logs</string>
<string name="open_issue_tracker">Abrir Rastreador de Problemas</string>

<string name="warning_hdr_tone_mapped">O vídeo HDR foi convertido para SDR para evitar problemas de compatibilidade do codificador neste dispositivo. Use AV1 se precisar preservar o HDR.</string>
<string name="warning_details">Detalhes do aviso</string>
<string name="dismiss">Dispensar</string>

</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-ru/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,9 @@
<string name="error_details">Детали ошибки</string>
<string name="copy_logs">Копировать логи</string>
<string name="open_issue_tracker">Открыть трекер задач</string>

<string name="warning_hdr_tone_mapped">HDR-видео было преобразовано в SDR, чтобы избежать проблем с кодировщиком на этом устройстве. Используйте AV1, если нужно сохранить HDR.</string>
<string name="warning_details">Детали предупреждения</string>
<string name="dismiss">Закрыть</string>

</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,9 @@
<string name="error_details">错误详情</string>
<string name="copy_logs">复制日志</string>
<string name="open_issue_tracker">打开问题追踪器</string>

<string name="warning_hdr_tone_mapped">HDR 视频已转换为 SDR,以避免此设备上的编码器兼容性问题。如需保留 HDR,请使用 AV1。</string>
<string name="warning_details">警告详情</string>
<string name="dismiss">关闭</string>

</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-zh-rTW/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,9 @@
<string name="error_details">錯誤詳情</string>
<string name="copy_logs">複製日誌</string>
<string name="open_issue_tracker">打開問題追蹤器</string>

<string name="warning_hdr_tone_mapped">HDR 影片已轉換為 SDR,以避免此裝置上的編碼器相容性問題。如需保留 HDR,請使用 AV1。</string>
<string name="warning_details">警告詳情</string>
<string name="dismiss">關閉</string>

</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
<string name="fps_60">60fps</string>
<string name="fps_30">30fps</string>
<string name="start_compression">Start Compression</string>
<string name="warning_hdr_tone_mapped">HDR video was tone-mapped to SDR to avoid encoder compatibility issues on this device. Use AV1 if you need to preserve HDR.</string>
<string name="warning_details">Warning Details</string>
<string name="dismiss">Dismiss</string>

<string name="error_prefix">Error: %1$s</string>
<string name="select_video">Select a video to compress</string>
<string name="add_video_desc">Add Video</string>
Expand Down