Skip to content

Commit bea334f

Browse files
authored
Merge pull request #42 from JoshAtticus/google-pixel-10-fix
Tensor G5 HDR Tonemapping Fix
2 parents 090b5b5 + dff5bdd commit bea334f

12 files changed

Lines changed: 126 additions & 8 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android {
1414
applicationId = "compress.joshattic.us"
1515
minSdk = 24
1616
targetSdk = 36
17-
versionCode = 16
18-
versionName = "1.5.1"
17+
versionCode = 17
18+
versionName = "1.5.1 (Experimental, google-pixel-10-fix branch)"
1919

2020
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2121
}

app/src/main/java/compress/joshattic/us/CompressorViewModel.kt

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,14 @@ data class CompressorUiState(
7676
val totalSavedBytes: Long = 0L,
7777

7878
val supportedCodecs: List<String> = emptyList(),
79-
val appInfoVersion: String = "1.5.1",
79+
val appInfoVersion: String = "1.5.1 (Experimental, google-pixel-10-fix branch)",
8080
val showBitrate: Boolean = false,
8181
val useMbps: Boolean = false,
8282
val hasShared: Boolean = false,
8383
val removeAudio: Boolean = false,
8484
val audioBitrate: Int = 128_000,
85-
val audioVolume: Float = 1.0f
85+
val audioVolume: Float = 1.0f,
86+
val warnings: List<String> = emptyList()
8687
) {
8788
private val minBitrate: Long
8889
get() {
@@ -660,7 +661,7 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
660661
val currentState = _uiState.value
661662
val inputUri = currentState.selectedUri ?: return
662663

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

665666
val outputDir = File(context.cacheDir, "compressed_videos")
666667
outputDir.mkdirs()
@@ -692,7 +693,7 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
692693
)
693694
.build()
694695

695-
val transformer = Transformer.Builder(context)
696+
val transformerBuilder = Transformer.Builder(context)
696697
.setVideoMimeType(videoMimeType)
697698
.setEncoderFactory(encoderFactory)
698699
.addListener(object : Transformer.Listener {
@@ -739,7 +740,8 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
739740
}
740741
}
741742
})
742-
.build()
743+
744+
val transformer = transformerBuilder.build()
743745

744746
activeTransformer = transformer
745747

@@ -769,9 +771,25 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
769771
.setRemoveAudio(currentState.removeAudio)
770772
.build()
771773

774+
var hdrMode = Composition.HDR_MODE_KEEP_HDR
775+
// this is certainly a workaround ever, a workaround so horrific, it would be enough to stop me from getting through the pearly gates
776+
// also google's fault, womp womp, can google stop being absolute garbage at anything related to the gpus
777+
// 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:
778+
if (Build.MANUFACTURER.equals("Google", ignoreCase = true) && Build.MODEL.contains("Pixel 10")) {
779+
if (videoMimeType == MimeTypes.VIDEO_H265 || videoMimeType == MimeTypes.VIDEO_H264) {
780+
if (isHdr(context, inputUri)) {
781+
hdrMode = Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL
782+
val warningMsg = getApplication<Application>().getString(R.string.warning_hdr_tone_mapped)
783+
_uiState.update { it.copy(warnings = listOf(warningMsg)) }
784+
}
785+
}
786+
}
787+
772788
val composition = Composition.Builder(
773789
listOf(EditedMediaItemSequence(editedMediaItem))
774-
).build()
790+
)
791+
.setHdrMode(hdrMode)
792+
.build()
775793

776794
transformer.start(composition, outputPath)
777795

@@ -809,6 +827,24 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
809827
return 0
810828
}
811829

830+
private fun isHdr(context: Context, uri: Uri): Boolean {
831+
val retriever = android.media.MediaMetadataRetriever()
832+
try {
833+
retriever.setDataSource(context, uri)
834+
// METADATA_KEY_COLOR_TRANSFER (36) is available on API 24+
835+
if (Build.VERSION.SDK_INT >= 24) {
836+
val transfer = retriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER)
837+
// 6 = ST2084 (PQ), 7 = HLG
838+
return transfer == "6" || transfer == "7"
839+
}
840+
} catch (e: Exception) {
841+
e.printStackTrace()
842+
} finally {
843+
try { retriever.release() } catch(e: Exception) {}
844+
}
845+
return false
846+
}
847+
812848
fun saveToUri(context: Context, targetUri: Uri) {
813849
val currentState = _uiState.value
814850
val compressedUri = currentState.compressedUri ?: return

app/src/main/java/compress/joshattic/us/MainActivity.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,44 @@ fun ResultScreen(
569569
fontWeight = FontWeight.Bold
570570
)
571571
}
572+
573+
if (state.warnings.isNotEmpty()) {
574+
Spacer(modifier = Modifier.height(16.dp))
575+
var showWarningDialog by remember { mutableStateOf(false) }
576+
577+
OutlinedButton(
578+
onClick = { showWarningDialog = true },
579+
colors = ButtonDefaults.outlinedButtonColors(
580+
contentColor = MaterialTheme.colorScheme.error
581+
),
582+
border = BorderStroke(1.dp, MaterialTheme.colorScheme.error)
583+
) {
584+
Icon(Icons.Outlined.Warning, contentDescription = null)
585+
Spacer(modifier = Modifier.width(8.dp))
586+
Text("${state.warnings.size} Warning${if (state.warnings.size > 1) "s" else ""} - Tap for Details")
587+
}
588+
589+
if (showWarningDialog) {
590+
AlertDialog(
591+
onDismissRequest = { showWarningDialog = false },
592+
icon = { Icon(Icons.Outlined.Warning, contentDescription = null, tint = MaterialTheme.colorScheme.error) },
593+
title = { Text(stringResource(R.string.warning_details)) },
594+
text = {
595+
Column {
596+
state.warnings.forEach { warning ->
597+
Text("$warning", style = MaterialTheme.typography.bodyMedium)
598+
Spacer(modifier = Modifier.height(8.dp))
599+
}
600+
}
601+
},
602+
confirmButton = {
603+
TextButton(onClick = { showWarningDialog = false }) {
604+
Text(stringResource(R.string.dismiss))
605+
}
606+
}
607+
)
608+
}
609+
}
572610

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

app/src/main/res/values-de/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,9 @@
9292
<string name="error_details">Fehlerdetails</string>
9393
<string name="copy_logs">Protokolle kopieren</string>
9494
<string name="open_issue_tracker">Issue Tracker öffnen</string>
95+
96+
<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>
97+
<string name="warning_details">Warnungsdetails</string>
98+
<string name="dismiss">Schließen</string>
99+
95100
</resources>

app/src/main/res/values-es/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,9 @@
7878
<string name="error_details">Detalles del Error</string>
7979
<string name="copy_logs">Copiar Registros</string>
8080
<string name="open_issue_tracker">Abrir Rastreador de Problemas</string>
81+
82+
<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>
83+
<string name="warning_details">Detalles de advertencia</string>
84+
<string name="dismiss">Descartar</string>
85+
8186
</resources>

app/src/main/res/values-ja/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,9 @@
103103
<string name="error_details">エラーの詳細</string>
104104
<string name="copy_logs">ログをコピー</string>
105105
<string name="open_issue_tracker">課題トラッカーを開く</string>
106+
107+
<string name="warning_hdr_tone_mapped">このデバイスでのエンコーダー互換性の問題を回避するため、HDRビデオはSDRにトーンマッピングされました。HDRを維持する必要がある場合は、AV1を使用してください。</string>
108+
<string name="warning_details">警告の詳細</string>
109+
<string name="dismiss">閉じる</string>
110+
106111
</resources>

app/src/main/res/values-ko/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,9 @@
9292
<string name="error_details">오류 세부 정보</string>
9393
<string name="copy_logs">로그 복사</string>
9494
<string name="open_issue_tracker">이슈 트래커 열기</string>
95+
96+
<string name="warning_hdr_tone_mapped">이 장치에서 인코더 호환성 문제를 방지하기 위해 HDR 비디오가 SDR로 톤 매핑되었습니다. HDR을 보존하려면 AV1을 사용하십시오.</string>
97+
<string name="warning_details">경고 세부 정보</string>
98+
<string name="dismiss">닫기</string>
99+
95100
</resources>

app/src/main/res/values-pt-rBR/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,9 @@
7676
<string name="error_details">Detalhes do Erro</string>
7777
<string name="copy_logs">Copiar Logs</string>
7878
<string name="open_issue_tracker">Abrir Rastreador de Problemas</string>
79+
80+
<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>
81+
<string name="warning_details">Detalhes do aviso</string>
82+
<string name="dismiss">Dispensar</string>
83+
7984
</resources>

app/src/main/res/values-ru/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,9 @@
9090
<string name="error_details">Детали ошибки</string>
9191
<string name="copy_logs">Копировать логи</string>
9292
<string name="open_issue_tracker">Открыть трекер задач</string>
93+
94+
<string name="warning_hdr_tone_mapped">HDR-видео было преобразовано в SDR, чтобы избежать проблем с кодировщиком на этом устройстве. Используйте AV1, если нужно сохранить HDR.</string>
95+
<string name="warning_details">Детали предупреждения</string>
96+
<string name="dismiss">Закрыть</string>
97+
9398
</resources>

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,9 @@
9292
<string name="error_details">错误详情</string>
9393
<string name="copy_logs">复制日志</string>
9494
<string name="open_issue_tracker">打开问题追踪器</string>
95+
96+
<string name="warning_hdr_tone_mapped">HDR 视频已转换为 SDR,以避免此设备上的编码器兼容性问题。如需保留 HDR,请使用 AV1。</string>
97+
<string name="warning_details">警告详情</string>
98+
<string name="dismiss">关闭</string>
99+
95100
</resources>

0 commit comments

Comments
 (0)