mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-19 12:20:26 +01:00
Compare commits
1 Commits
develop
...
renovate/s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b512024c93 |
4
bun.lock
4
bun.lock
@@ -16,7 +16,7 @@
|
|||||||
"@react-native-community/netinfo": "^12.0.0",
|
"@react-native-community/netinfo": "^12.0.0",
|
||||||
"@react-navigation/material-top-tabs": "7.4.28",
|
"@react-navigation/material-top-tabs": "7.4.28",
|
||||||
"@react-navigation/native": "^7.2.5",
|
"@react-navigation/native": "^7.2.5",
|
||||||
"@shopify/flash-list": "2.0.3",
|
"@shopify/flash-list": "2.3.2",
|
||||||
"@tanstack/query-sync-storage-persister": "^5.100.14",
|
"@tanstack/query-sync-storage-persister": "^5.100.14",
|
||||||
"@tanstack/react-pacer": "^0.19.1",
|
"@tanstack/react-pacer": "^0.19.1",
|
||||||
"@tanstack/react-query": "5.100.14",
|
"@tanstack/react-query": "5.100.14",
|
||||||
@@ -536,7 +536,7 @@
|
|||||||
|
|
||||||
"@react-navigation/routers": ["@react-navigation/routers@7.6.0", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-lblhDXfS75jLc7G2K7BZGM+7cjqQXk13X/MA4fq/12r62zM+fBhhreLzYflSitrDDXFRJpSvJXy0ziiGU04Xow=="],
|
"@react-navigation/routers": ["@react-navigation/routers@7.6.0", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-lblhDXfS75jLc7G2K7BZGM+7cjqQXk13X/MA4fq/12r62zM+fBhhreLzYflSitrDDXFRJpSvJXy0ziiGU04Xow=="],
|
||||||
|
|
||||||
"@shopify/flash-list": ["@shopify/flash-list@2.0.3", "", { "dependencies": { "tslib": "2.8.1" }, "peerDependencies": { "@babel/runtime": "*", "react": "*", "react-native": "*" } }, "sha512-jUlHuZFoPdqRCDvOqsb2YkTttRPyV8Tb/EjCx3gE2wjr4UTM+fE0Ltv9bwBg0K7yo/SxRNXaW7xu5utusRb0xA=="],
|
"@shopify/flash-list": ["@shopify/flash-list@2.3.2", "", { "peerDependencies": { "@babel/runtime": "*", "react": "*", "react-native": "*" } }, "sha512-vQnd0y0Ag11yzS30llaeCrtIU3xYTMe7KEOP3dveLImnVjQEUw6BEg1+Ztja6aODlVNz1BpvxtlQ5eZGxiLwKw=="],
|
||||||
|
|
||||||
"@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="],
|
"@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="],
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.app.UiModeManager
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.content.res.AssetManager
|
import android.content.res.AssetManager
|
||||||
import android.os.Build
|
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
@@ -36,30 +35,6 @@ class MPVLayerRenderer(private val context: Context) : MPVLib.EventObserver {
|
|||||||
return uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION
|
return uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* True only on the Android emulator. Its goldfish/ranchu MediaCodec can't bind a
|
|
||||||
* decode output surface (decode opens with surface 0x0): HEVC then fails cleanly and
|
|
||||||
* mpv auto-falls-back to software, but H.264 "opens" deceptively and wedges the core
|
|
||||||
* (no fallback) — black video, then any command (seek/pause) deadlocks the UI thread
|
|
||||||
* → ANR. We force software decoding here.
|
|
||||||
*
|
|
||||||
* Only QEMU/SDK-exclusive signals are checked so a real device can never match — a
|
|
||||||
* false positive would needlessly drop shipping hardware to software decoding. The
|
|
||||||
* emulator reports ro.hardware=goldfish|ranchu, an sdk_* product, or a generic/
|
|
||||||
* emulator build fingerprint, none of which appear on real devices.
|
|
||||||
*/
|
|
||||||
private fun isEmulator(): Boolean {
|
|
||||||
val hardware = Build.HARDWARE.lowercase()
|
|
||||||
if (hardware == "goldfish" || hardware == "ranchu") return true
|
|
||||||
|
|
||||||
val product = Build.PRODUCT
|
|
||||||
if (product == "sdk" || product.startsWith("sdk_")) return true
|
|
||||||
|
|
||||||
val fingerprint = Build.FINGERPRINT
|
|
||||||
return fingerprint.startsWith("generic") ||
|
|
||||||
fingerprint.contains("emulator", ignoreCase = true)
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Delegate {
|
interface Delegate {
|
||||||
fun onPositionChanged(position: Double, duration: Double, cacheSeconds: Double)
|
fun onPositionChanged(position: Double, duration: Double, cacheSeconds: Double)
|
||||||
fun onPauseChanged(isPaused: Boolean)
|
fun onPauseChanged(isPaused: Boolean)
|
||||||
@@ -194,21 +169,15 @@ class MPVLayerRenderer(private val context: Context) : MPVLib.EventObserver {
|
|||||||
MPVLib.setOptionString("gpu-context", "android")
|
MPVLib.setOptionString("gpu-context", "android")
|
||||||
MPVLib.setOptionString("opengl-es", "yes")
|
MPVLib.setOptionString("opengl-es", "yes")
|
||||||
|
|
||||||
// Hardware decode path:
|
// Hardware video decoding
|
||||||
// - Real TV hardware: zero-copy `mediacodec` (fastest on low-power devices).
|
// TV: zero-copy (mediacodec) for better performance on low-power devices
|
||||||
// - Real phone: `mediacodec-copy` (broadest compatibility).
|
// Mobile: copy mode (mediacodec-copy) for better compatibility
|
||||||
// - Emulator: software decode. Its MediaCodec can't bind an output surface
|
val isTV = isTvDevice()
|
||||||
// (surface 0x0); HEVC then fails cleanly and mpv auto-falls-back to software,
|
if (isTV) {
|
||||||
// but H.264 "opens" deceptively and wedges the core with no fallback (black
|
MPVLib.setOptionString("hwdec", "mediacodec")
|
||||||
// video, then any command — seek/pause — deadlocks the UI thread → ANR).
|
MPVLib.setOptionString("profile", "fast")
|
||||||
// hwdec=no makes every codec render via the gpu-next VO. Real devices unaffected.
|
} else {
|
||||||
when {
|
MPVLib.setOptionString("hwdec", "mediacodec-copy")
|
||||||
isEmulator() -> MPVLib.setOptionString("hwdec", "no")
|
|
||||||
isTvDevice() -> {
|
|
||||||
MPVLib.setOptionString("hwdec", "mediacodec")
|
|
||||||
MPVLib.setOptionString("profile", "fast")
|
|
||||||
}
|
|
||||||
else -> MPVLib.setOptionString("hwdec", "mediacodec-copy")
|
|
||||||
}
|
}
|
||||||
MPVLib.setOptionString("hwdec-codecs", "h264,hevc,mpeg4,mpeg2video,vp8,vp9,av1")
|
MPVLib.setOptionString("hwdec-codecs", "h264,hevc,mpeg4,mpeg2video,vp8,vp9,av1")
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
"@react-native-community/netinfo": "^12.0.0",
|
"@react-native-community/netinfo": "^12.0.0",
|
||||||
"@react-navigation/material-top-tabs": "7.4.28",
|
"@react-navigation/material-top-tabs": "7.4.28",
|
||||||
"@react-navigation/native": "^7.2.5",
|
"@react-navigation/native": "^7.2.5",
|
||||||
"@shopify/flash-list": "2.0.3",
|
"@shopify/flash-list": "2.3.2",
|
||||||
"@tanstack/query-sync-storage-persister": "^5.100.14",
|
"@tanstack/query-sync-storage-persister": "^5.100.14",
|
||||||
"@tanstack/react-pacer": "^0.19.1",
|
"@tanstack/react-pacer": "^0.19.1",
|
||||||
"@tanstack/react-query": "5.100.14",
|
"@tanstack/react-query": "5.100.14",
|
||||||
|
|||||||
Reference in New Issue
Block a user