fix(ci): resolve sanity check failures
This commit is contained in:
@@ -35,8 +35,15 @@ val extractMpvLibcxx by tasks.registering {
|
|||||||
outDir.deleteRecursively() // drop stale ABIs from a previous AAR version
|
outDir.deleteRecursively() // drop stale ABIs from a previous AAR version
|
||||||
outDir.mkdirs()
|
outDir.mkdirs()
|
||||||
exec {
|
exec {
|
||||||
commandLine("unzip", "-q", "-o", aar.absolutePath,
|
commandLine(
|
||||||
"jni/*/libc++_shared.so", "-d", outDir.absolutePath)
|
"unzip",
|
||||||
|
"-q",
|
||||||
|
"-o",
|
||||||
|
aar.absolutePath,
|
||||||
|
"jni/*/libc++_shared.so",
|
||||||
|
"-d",
|
||||||
|
outDir.absolutePath
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ class MainActivity : FlutterActivity() {
|
|||||||
// Actual process bitness: low-end TV boxes often run 32-bit userspace.
|
// Actual process bitness: low-end TV boxes often run 32-bit userspace.
|
||||||
"is64Bit" to Process.is64Bit(),
|
"is64Bit" to Process.is64Bit(),
|
||||||
"isLowRamDevice" to activityManager.isLowRamDevice,
|
"isLowRamDevice" to activityManager.isLowRamDevice,
|
||||||
"totalMemBytes" to memoryInfo.totalMem,
|
"totalMemBytes" to memoryInfo.totalMem
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+50
-17
@@ -94,7 +94,8 @@ class AudioNormalizationEffect(private val log: (String, String, String) -> Unit
|
|||||||
@RequiresApi(28)
|
@RequiresApi(28)
|
||||||
private fun tryDynamicsProcessing(sessionId: Int, channelCount: Int): Boolean = try {
|
private fun tryDynamicsProcessing(sessionId: Int, channelCount: Int): Boolean = try {
|
||||||
val band = DynamicsProcessing.MbcBand(
|
val band = DynamicsProcessing.MbcBand(
|
||||||
/* inUse = */ true,
|
// inUse
|
||||||
|
true,
|
||||||
MBC_CUTOFF_HZ,
|
MBC_CUTOFF_HZ,
|
||||||
MBC_ATTACK_MS,
|
MBC_ATTACK_MS,
|
||||||
MBC_RELEASE_MS,
|
MBC_RELEASE_MS,
|
||||||
@@ -103,27 +104,49 @@ class AudioNormalizationEffect(private val log: (String, String, String) -> Unit
|
|||||||
MBC_KNEE_DB,
|
MBC_KNEE_DB,
|
||||||
MBC_NOISE_GATE_DB,
|
MBC_NOISE_GATE_DB,
|
||||||
MBC_EXPANDER_RATIO,
|
MBC_EXPANDER_RATIO,
|
||||||
/* preGain = */ 0f,
|
// preGain
|
||||||
|
0f,
|
||||||
MBC_POST_GAIN_DB
|
MBC_POST_GAIN_DB
|
||||||
)
|
)
|
||||||
val mbc = DynamicsProcessing.Mbc(/* inUse = */ true, /* enabled = */ true, /* bandCount = */ 1)
|
val mbc = DynamicsProcessing.Mbc(
|
||||||
.apply { setBand(0, band) }
|
// inUse
|
||||||
|
true,
|
||||||
|
// enabled
|
||||||
|
true,
|
||||||
|
// bandCount
|
||||||
|
1
|
||||||
|
).apply { setBand(0, band) }
|
||||||
val limiter = DynamicsProcessing.Limiter(
|
val limiter = DynamicsProcessing.Limiter(
|
||||||
/* inUse = */ true,
|
// inUse
|
||||||
/* enabled = */ true,
|
true,
|
||||||
/* linkGroup = */ 0,
|
// enabled
|
||||||
|
true,
|
||||||
|
// linkGroup
|
||||||
|
0,
|
||||||
LIMITER_ATTACK_MS,
|
LIMITER_ATTACK_MS,
|
||||||
LIMITER_RELEASE_MS,
|
LIMITER_RELEASE_MS,
|
||||||
LIMITER_RATIO,
|
LIMITER_RATIO,
|
||||||
LIMITER_THRESHOLD_DB,
|
LIMITER_THRESHOLD_DB,
|
||||||
/* postGain = */ 0f
|
// postGain
|
||||||
|
0f
|
||||||
)
|
)
|
||||||
val channel = DynamicsProcessing.Channel(
|
val channel = DynamicsProcessing.Channel(
|
||||||
/* inputGain = */ 0f,
|
// inputGain
|
||||||
/* preEqInUse = */ false, /* preEqBandCount = */ 0,
|
0f,
|
||||||
/* mbcInUse = */ true, /* mbcBandCount = */ 1,
|
// preEqInUse
|
||||||
/* postEqInUse = */ false, /* postEqBandCount = */ 0,
|
false,
|
||||||
/* limiterInUse = */ true
|
// preEqBandCount
|
||||||
|
0,
|
||||||
|
// mbcInUse
|
||||||
|
true,
|
||||||
|
// mbcBandCount
|
||||||
|
1,
|
||||||
|
// postEqInUse
|
||||||
|
false,
|
||||||
|
// postEqBandCount
|
||||||
|
0,
|
||||||
|
// limiterInUse
|
||||||
|
true
|
||||||
).apply {
|
).apply {
|
||||||
setMbc(mbc)
|
setMbc(mbc)
|
||||||
setLimiter(limiter)
|
setLimiter(limiter)
|
||||||
@@ -131,10 +154,20 @@ class AudioNormalizationEffect(private val log: (String, String, String) -> Unit
|
|||||||
val config = DynamicsProcessing.Config.Builder(
|
val config = DynamicsProcessing.Config.Builder(
|
||||||
DynamicsProcessing.VARIANT_FAVOR_FREQUENCY_RESOLUTION,
|
DynamicsProcessing.VARIANT_FAVOR_FREQUENCY_RESOLUTION,
|
||||||
channelCount,
|
channelCount,
|
||||||
/* preEqInUse = */ false, /* preEqBandCount = */ 0,
|
// preEqInUse
|
||||||
/* mbcInUse = */ true, /* mbcBandCount = */ 1,
|
false,
|
||||||
/* postEqInUse = */ false, /* postEqBandCount = */ 0,
|
// preEqBandCount
|
||||||
/* limiterInUse = */ true
|
0,
|
||||||
|
// mbcInUse
|
||||||
|
true,
|
||||||
|
// mbcBandCount
|
||||||
|
1,
|
||||||
|
// postEqInUse
|
||||||
|
false,
|
||||||
|
// postEqBandCount
|
||||||
|
0,
|
||||||
|
// limiterInUse
|
||||||
|
true
|
||||||
)
|
)
|
||||||
.setPreferredFrameDuration(FRAME_DURATION_MS)
|
.setPreferredFrameDuration(FRAME_DURATION_MS)
|
||||||
.setAllChannelsTo(channel)
|
.setAllChannelsTo(channel)
|
||||||
|
|||||||
@@ -2140,8 +2140,7 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** True when [format] is an ASS/SSA subtitle track (rendered by libass). */
|
/** True when [format] is an ASS/SSA subtitle track (rendered by libass). */
|
||||||
private fun isAssSubtitleFormat(format: Format): Boolean =
|
private fun isAssSubtitleFormat(format: Format): Boolean = format.sampleMimeType == MimeTypes.TEXT_SSA || format.codecs == MimeTypes.TEXT_SSA
|
||||||
format.sampleMimeType == MimeTypes.TEXT_SSA || format.codecs == MimeTypes.TEXT_SSA
|
|
||||||
|
|
||||||
/** Sets the ASS-subtitles tunneling block; returns true when the flag changed. */
|
/** Sets the ASS-subtitles tunneling block; returns true when the flag changed. */
|
||||||
private fun updateAssSubtitlesForTunneling(assActive: Boolean): Boolean {
|
private fun updateAssSubtitlesForTunneling(assActive: Boolean): Boolean {
|
||||||
@@ -2150,15 +2149,19 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
|||||||
emitLog(
|
emitLog(
|
||||||
"info",
|
"info",
|
||||||
"tunneling",
|
"tunneling",
|
||||||
if (assActive) "ASS subtitle track selected: tunneling DISABLED (frame metadata required for libass)"
|
if (assActive) {
|
||||||
else "ASS subtitle track deselected: tunneling unblocked"
|
"ASS subtitle track selected: tunneling DISABLED (frame metadata required for libass)"
|
||||||
|
} else {
|
||||||
|
"ASS subtitle track deselected: tunneling unblocked"
|
||||||
|
}
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun evaluateAssSubtitlesForTunneling(tracks: Tracks) {
|
private fun evaluateAssSubtitlesForTunneling(tracks: Tracks) {
|
||||||
val assSelected = tracks.groups.any { group ->
|
val assSelected = tracks.groups.any { group ->
|
||||||
group.type == C.TRACK_TYPE_TEXT && group.isSelected &&
|
group.type == C.TRACK_TYPE_TEXT &&
|
||||||
|
group.isSelected &&
|
||||||
(0 until group.length).any { isAssSubtitleFormat(group.getTrackFormat(it)) }
|
(0 until group.length).any { isAssSubtitleFormat(group.getTrackFormat(it)) }
|
||||||
}
|
}
|
||||||
updateAssSubtitlesForTunneling(assSelected)
|
updateAssSubtitlesForTunneling(assSelected)
|
||||||
@@ -2212,8 +2215,12 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
|||||||
private fun calculateTunnelingEnabled(): Boolean? {
|
private fun calculateTunnelingEnabled(): Boolean? {
|
||||||
val player = exoPlayer ?: return null
|
val player = exoPlayer ?: return null
|
||||||
val audioDelayActive = (renderersFactory?.audioDelayUs?.get() ?: 0L) != 0L
|
val audioDelayActive = (renderersFactory?.audioDelayUs?.get() ?: 0L) != 0L
|
||||||
return tunnelingUserEnabled && (player.playbackParameters.speed == 1f) && !tunnelingDisabledForCodec &&
|
return tunnelingUserEnabled &&
|
||||||
!tunnelingDisabledForAssSubtitles && !audioDelayActive && !audioNormalizationEnabled
|
(player.playbackParameters.speed == 1f) &&
|
||||||
|
!tunnelingDisabledForCodec &&
|
||||||
|
!tunnelingDisabledForAssSubtitles &&
|
||||||
|
!audioDelayActive &&
|
||||||
|
!audioNormalizationEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateCurrentTunnelingState(reason: String, shouldTunnel: Boolean): Boolean {
|
private fun updateCurrentTunnelingState(reason: String, shouldTunnel: Boolean): Boolean {
|
||||||
@@ -2691,7 +2698,9 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
|||||||
val tunnelingWillFlip = calculateTunnelingEnabled() != currentTunneledPlayback
|
val tunnelingWillFlip = calculateTunnelingEnabled() != currentTunneledPlayback
|
||||||
val outputEncoding = lastAudioTrackConfig?.encoding
|
val outputEncoding = lastAudioTrackConfig?.encoding
|
||||||
val selectedMime = selectedAudioFormat()?.sampleMimeType
|
val selectedMime = selectedAudioFormat()?.sampleMimeType
|
||||||
val needsBounce = !tunnelingWillFlip && outputEncoding != null && selectedMime != null &&
|
val needsBounce = !tunnelingWillFlip &&
|
||||||
|
outputEncoding != null &&
|
||||||
|
selectedMime != null &&
|
||||||
isEncodedAudioMimeType(selectedMime) &&
|
isEncodedAudioMimeType(selectedMime) &&
|
||||||
(if (enabled) !isPcmEncoding(outputEncoding) else isPcmEncoding(outputEncoding))
|
(if (enabled) !isPcmEncoding(outputEncoding) else isPcmEncoding(outputEncoding))
|
||||||
if (needsBounce) {
|
if (needsBounce) {
|
||||||
|
|||||||
@@ -217,8 +217,8 @@ static int truncationLogCounter = 0;
|
|||||||
// On changed == 0, returns (0, 0, 0, changed, 0) without touching the buffers —
|
// On changed == 0, returns (0, 0, 0, changed, 0) without touching the buffers —
|
||||||
// caller reuses the atlas texture already on the GPU.
|
// caller reuses the atlas texture already on the GPU.
|
||||||
JNIEXPORT jobject JNICALL Java_com_edde746_plezy_libass_AssRender_nativeAssRenderFrameAtlas(
|
JNIEXPORT jobject JNICALL Java_com_edde746_plezy_libass_AssRender_nativeAssRenderFrameAtlas(
|
||||||
JNIEnv* env, jclass clazz, jlong render, jlong track, jlong time, jobject atlasBuf, jint atlasMaxW,
|
JNIEnv* env, jclass clazz, jlong render, jlong track, jlong time, jobject atlasBuf, jint atlasMaxW, jint atlasMaxH,
|
||||||
jint atlasMaxH, jobject vertexBuf) {
|
jobject vertexBuf) {
|
||||||
if (!render || !track || !atlasBuf || !vertexBuf || atlasMaxW <= 0 || atlasMaxH <= 0) return NULL;
|
if (!render || !track || !atlasBuf || !vertexBuf || atlasMaxW <= 0 || atlasMaxH <= 0) return NULL;
|
||||||
|
|
||||||
jclass atlasFrameClass = (*env)->FindClass(env, "com/edde746/plezy/libass/AssAtlasFrame");
|
jclass atlasFrameClass = (*env)->FindClass(env, "com/edde746/plezy/libass/AssAtlasFrame");
|
||||||
@@ -317,8 +317,8 @@ JNIEXPORT jobject JNICALL Java_com_edde746_plezy_libass_AssRender_nativeAssRende
|
|||||||
|
|
||||||
if (truncated > 0 && (truncationLogCounter++ & 63) == 0) {
|
if (truncated > 0 && (truncationLogCounter++ & 63) == 0) {
|
||||||
__android_log_print(
|
__android_log_print(
|
||||||
ANDROID_LOG_WARN, LOG_TAG, "atlas truncation: %d of %d images dropped (atlas %dx%d, %d quads max)",
|
ANDROID_LOG_WARN, LOG_TAG, "atlas truncation: %d of %d images dropped (atlas %dx%d, %d quads max)", truncated,
|
||||||
truncated, n, atlasMaxW, atlasMaxH, maxQuads);
|
n, atlasMaxW, atlasMaxH, maxQuads);
|
||||||
}
|
}
|
||||||
if (accepted == 0) {
|
if (accepted == 0) {
|
||||||
free(items);
|
free(items);
|
||||||
|
|||||||
+2
-1
@@ -230,7 +230,8 @@ class SpecRenderEngineTest {
|
|||||||
h.script.add(changed())
|
h.script.add(changed())
|
||||||
val first = h.engine.service(0, pinned = true) as SpecRenderEngine.Outcome.Post
|
val first = h.engine.service(0, pinned = true) as SpecRenderEngine.Outcome.Post
|
||||||
var pts = 0L
|
var pts = 0L
|
||||||
repeat(4) { // build cadence; renders return changed for simplicity
|
repeat(4) {
|
||||||
|
// build cadence; renders return changed for simplicity
|
||||||
pts += DELTA
|
pts += DELTA
|
||||||
h.engine.service(pts, pinned = true)
|
h.engine.service(pts, pinned = true)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import 'package:plezy/utils/platform_detector.dart';
|
|||||||
const _library = MediaLibrary(id: '1', backend: MediaBackend.plex, title: 'Movies');
|
const _library = MediaLibrary(id: '1', backend: MediaBackend.plex, title: 'Movies');
|
||||||
|
|
||||||
class _ProbeTab extends BaseLibraryTab<String> {
|
class _ProbeTab extends BaseLibraryTab<String> {
|
||||||
const _ProbeTab({super.key, required this.loadedItems, required super.onBack, super.isActive = true})
|
const _ProbeTab({super.key, required this.loadedItems, required super.onBack})
|
||||||
: super(library: _library);
|
: super(library: _library, isActive: true);
|
||||||
|
|
||||||
final List<String> loadedItems;
|
final List<String> loadedItems;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user