Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -1453,45 +1453,52 @@ class GeneratorPlayer : FullScreenPlayer() {

val audioArrayAdapter = ArrayAdapter<String>(ctx, R.layout.sort_bottom_single_choice)

audioArrayAdapter.addAll(currentAudioTracks.mapIndexed { index, track ->
val language = track.language?.let { fromTagToLanguageName(it) ?: it }
?: track.label
?: "Audio"

val codec = track.sampleMimeType?.let { mimeType ->
when {
mimeType.contains("mp4a") || mimeType.contains("aac") -> "aac"
mimeType.contains("ac-3") || mimeType.contains("ac3") -> "ac3"
mimeType.contains("eac3-joc") -> "Dolby Atmos"
mimeType.contains("eac3") -> "eac3"
mimeType.contains("opus") -> "opus"
mimeType.contains("vorbis") -> "vorbis"
mimeType.contains("mp3") || mimeType.contains("mpeg") -> "mp3"
mimeType.contains("flac") -> "flac"
mimeType.contains("dts") -> "dts"
else -> mimeType.substringAfter("/")
audioArrayAdapter.addAll(
currentAudioTracks.mapIndexed { _, track ->

val language = (
track.language?.trim()?.let { raw ->
fromTagToLanguageName(raw)
?: fromTagToLanguageName(raw.replace('_','-').substringBefore('-').lowercase())
?: raw
}
?: track.label
?: "Audio"
).replaceFirstChar { it.uppercaseChar() }

val codec = track.sampleMimeType
?.lowercase()
?.let { mime ->
when {
mime.contains("eac3-joc") -> "Dolby Atmos"
mime.contains("eac3") -> "E-AC3"
mime.contains("ac-3") || mime.contains("ac3") -> "AC3"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch!!!!! Having ac3 before the others was preventing eac3 or eac3-joc from being properly detected.

Looking forward to seeing this PR merged.

mime.contains("mp4a") || mime.contains("aac") -> "AAC"
mime.contains("opus") -> "Opus"
mime.contains("vorbis") -> "Vorbis"
mime.contains("mp3") -> "MP3"
mime.contains("flac") -> "FLAC"
mime.contains("dts") -> "DTS"
else -> "Unknown"
}
} ?: "Unknown"

val channels = when (track.channelCount ?: 0) {
1 -> "Mono"
2 -> "Stereo"
6 -> "5.1"
8 -> "7.1"
else -> "${track.channelCount ?: "?"}ch"
}
} ?: "codec?"


val channels: Int = track.channelCount ?: 0
val channelConfig = when (channels) {
1 -> "mono"
2 -> "stereo"
6 -> "5.1"
8 -> "7.1"
else -> "${channels}Ch"
}

listOfNotNull(
"[$index]",
language.replaceFirstChar { it.uppercaseChar() },
codec.uppercase(),
channelConfig.replaceFirstChar { it.uppercaseChar() }
).joinToString(" • ")

"[$index] $language $codec $channelConfig"
})
listOfNotNull(
language.takeIf { it.isNotBlank() }?.replaceFirstChar { it.uppercaseChar() },
channels.takeIf { it.isNotBlank() }?.replaceFirstChar { it.uppercaseChar() },
codec.takeIf { it.isNotBlank() }?.uppercase()?.let { "($it)" }
).joinToString(" ")

}
)

audioList.adapter = audioArrayAdapter
audioList.choiceMode = AbsListView.CHOICE_MODE_SINGLE
Expand Down Expand Up @@ -1849,6 +1856,38 @@ class GeneratorPlayer : FullScreenPlayer() {
}
}


private fun videoCodecName(mime: String?): String? {
val m = mime?.lowercase() ?: return null
return when {
m.contains("avc") || m.contains("h264") -> "AVC"
m.contains("hevc") || m.contains("h265") -> "HEVC"
m.contains("av1") -> "AV1"
m.contains("vp9") -> "VP9"
m.contains("vp8") -> "VP8"
"/" in m -> m.substringAfter("/").uppercase()
else -> m.uppercase()
}
}

private fun audioCodecName(mime: String?): String? {
val m = mime?.lowercase() ?: return null
return when {
m.contains("eac3-joc") -> "Dolby Atmos"
m.contains("mp4a") || m.contains("aac") -> "AAC"
m.contains("ac-3") || m.contains("ac3") -> "AC3"
m.contains("eac3") -> "E-AC3"
m.contains("opus") -> "Opus"
m.contains("vorbis") -> "Vorbis"
m.contains("mp3") -> "MP3"
m.contains("flac") -> "FLAC"
m.contains("dts") -> "DTS"
"/" in m -> m.substringAfter("/").uppercase()
else -> m.uppercase()
}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have you thought about adding the audio channel configuration (Mono, Stereo, 5.1, ...) to the player info?


private fun updatePlayerInfo() {
val tracks = player.getVideoTracks()

Expand All @@ -1859,12 +1898,16 @@ class GeneratorPlayer : FullScreenPlayer() {
val prefs = PreferenceManager.getDefaultSharedPreferences(ctx)
showMediaInfo = prefs.getBoolean(ctx.getString(R.string.show_media_info_key), false)

val videoCodec = videoTrack?.sampleMimeType?.substringAfterLast('/')?.uppercase()
val audioCodec = audioTrack?.sampleMimeType?.substringAfterLast('/')?.uppercase()
val language = listOfNotNull(
audioTrack?.label,
fromTagToLanguageName(audioTrack?.language)?.let { "[$it]" }
).joinToString(" ")
val videoCodec = videoCodecName(videoTrack?.sampleMimeType)
val audioCodec = audioCodecName(audioTrack?.sampleMimeType)
val languageName = fromTagToLanguageName(audioTrack?.language)
val label = audioTrack?.label

val language = languageName?.takeIf { it.isNotBlank() }?.let { lang ->
label?.takeIf { it.isNotBlank() && !it.equals(lang, true) }
?.let { "$lang ($it)" }
?: lang
} ?: label?.takeIf { it.isNotBlank() }

val stats = arrayOf(videoCodec, audioCodec, language).filter { !it.isNullOrBlank() }.joinToString(" • ")

Expand Down