mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 19:51:51 +09:00
film grain effect to alleviate 3d scene with low-res texture look
This commit is contained in:
@@ -53,6 +53,8 @@ let subtitlePosition = 0 // 0=bottom center (default)
|
||||
|
||||
// Parse command line options
|
||||
let interactive = false
|
||||
let userDefinedFilmGrain = false
|
||||
let filmGrainLevel = null
|
||||
|
||||
if (exec_args.length > 2) {
|
||||
for (let i = 2; i < exec_args.length; i++) {
|
||||
@@ -60,6 +62,26 @@ if (exec_args.length > 2) {
|
||||
if (arg === "-i") {
|
||||
interactive = true
|
||||
}
|
||||
else if (arg.startsWith("--filter-film-grain")) {
|
||||
// Extract noise level from argument
|
||||
const parts = arg.split(/[=\s]/)
|
||||
if (parts.length > 1) {
|
||||
const level = parseInt(parts[1])
|
||||
if (!isNaN(level) && level >= 1 && level <= 32767) {
|
||||
filmGrainLevel = level
|
||||
userDefinedFilmGrain = true
|
||||
}
|
||||
}
|
||||
// Try next argument if no '=' found
|
||||
else if (i + 1 < exec_args.length) {
|
||||
const level = parseInt(exec_args[i + 1])
|
||||
if (!isNaN(level) && level >= 1 && level <= 32767) {
|
||||
filmGrainLevel = level
|
||||
userDefinedFilmGrain = true
|
||||
i++ // Skip next arg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -271,6 +293,13 @@ if (header.version < 1 || header.version > 8) {
|
||||
return
|
||||
}
|
||||
|
||||
function setFilmGrainLevel(header) {
|
||||
// decide film grain strength by quality level
|
||||
filmGrainLevel = [9,6,-4,3,-2,-2,-2][header.qualityLevel - 1]
|
||||
}
|
||||
|
||||
setFilmGrainLevel(header)
|
||||
|
||||
// Helper function to decode channel layout name
|
||||
function getChannelLayoutName(layout) {
|
||||
switch (layout) {
|
||||
@@ -670,6 +699,7 @@ try {
|
||||
currentCueIndex++
|
||||
}
|
||||
totalFilesProcessed++
|
||||
setFilmGrainLevel(header)
|
||||
|
||||
console.log(`\nStarting file ${currentFileIndex}:`)
|
||||
console.log(`Resolution: ${header.width}x${header.height}`)
|
||||
@@ -726,6 +756,8 @@ try {
|
||||
serial.println(` FIELD_SIZE: ${FIELD_SIZE}`)
|
||||
}
|
||||
|
||||
let thisFrameNoiseLevel = (filmGrainLevel >= 0) ? filmGrainLevel : -(filmGrainLevel - (trueFrameCount % 2))
|
||||
|
||||
// Call new TAV hardware decoder that handles Zstd decompression internally
|
||||
// Note: No longer using JS gzip.decompFromTo - Kotlin handles Zstd natively
|
||||
decoderDbgInfo = graphics.tavDecodeCompressed(
|
||||
@@ -739,7 +771,8 @@ try {
|
||||
header.waveletFilter, // TAV-specific parameter
|
||||
header.decompLevels, // TAV-specific parameter
|
||||
isLossless,
|
||||
header.version // TAV version for colour space detection
|
||||
header.version, // TAV version for colour space detection
|
||||
thisFrameNoiseLevel // Undocumented spooky noise filter
|
||||
)
|
||||
|
||||
decodeTime = (sys.nanoTime() - decodeStart) / 1000000.0
|
||||
|
||||
Reference in New Issue
Block a user