Skip to content
Closed
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 = 13
versionName = "1.3.3"
versionCode = 14
versionName = "1.3.3-huawei-android-10-fix-test"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
20 changes: 19 additions & 1 deletion app/src/main/java/compress/joshattic/us/CompressorViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ import androidx.media3.transformer.ExportException
import androidx.media3.transformer.ExportResult
import androidx.media3.transformer.Transformer
import androidx.media3.transformer.VideoEncoderSettings
import androidx.media3.transformer.DefaultAssetLoaderFactory
import androidx.media3.transformer.DefaultDecoderFactory
import androidx.media3.exoplayer.mediacodec.MediaCodecSelector
import androidx.media3.exoplayer.mediacodec.MediaCodecUtil
import androidx.media3.common.util.Clock
import androidx.media3.common.Effect
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
Expand Down Expand Up @@ -68,7 +73,7 @@ data class CompressorUiState(
val totalSavedBytes: Long = 0L,

val supportedCodecs: List<String> = emptyList(),
val appInfoVersion: String = "1.3.3",
val appInfoVersion: String = "1.3.3 Huawei Android 10 Fix Test",
val showBitrate: Boolean = false,
val useMbps: Boolean = false,
val hasShared: Boolean = false,
Expand Down Expand Up @@ -464,10 +469,23 @@ class CompressorViewModel(application: Application) : AndroidViewModel(applicati
.build()
)
.build()

// Force software decoder to be safe against driver bugs (e.g. Huawei DynamicANWBuffer crash)
val softwareDecoderSelector = MediaCodecSelector { mimeType, requiresSecureDecoder, requiresTunnelingDecoder ->
MediaCodecUtil.getDecoderInfos(mimeType, requiresSecureDecoder, requiresTunnelingDecoder)
.filter { !it.hardwareAccelerated }
}

val assetLoaderFactory = DefaultAssetLoaderFactory(
context,
DefaultDecoderFactory.Builder(context).setMediaCodecSelector(softwareDecoderSelector).build(),
Clock.DEFAULT
)

val transformer = Transformer.Builder(context)
.setVideoMimeType(videoMimeType)
.setEncoderFactory(encoderFactory)
.setAssetLoaderFactory(assetLoaderFactory)
.addListener(object : Transformer.Listener {
override fun onCompleted(composition: Composition, exportResult: ExportResult) {
val finalSize = outputFile.length()
Expand Down