diff --git a/.idea/libraries/aircompressor_0_25.xml b/.idea/libraries/aircompressor_0_25.xml new file mode 100644 index 0000000..ef8117e --- /dev/null +++ b/.idea/libraries/aircompressor_0_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/disk0/tvdos/bin/encodemov.js b/assets/disk0/tvdos/bin/encodemov.js index e7eefc5..6ca5e3d 100644 --- a/assets/disk0/tvdos/bin/encodemov.js +++ b/assets/disk0/tvdos/bin/encodemov.js @@ -1,12 +1,12 @@ // some manual configurations // -let IPFMODE = 2 // 1 or 2 -let TOTAL_FRAMES = 3813 -let FPS = 30 // must be integer +let IPFMODE = 1 // 1 or 2 +let TOTAL_FRAMES = 6636 +let FPS = 15 // must be integer let WIDTH = 560 let HEIGHT = 448 -let PATHFUN = (i) => `/ddol2/${(''+i).padStart(5,'0')}.png` // how can be the image file found, if a frame number (starts from 1) were given -let AUDIOTRACK = 'ddol.mp2' +let PATHFUN = (i) => `C:/steamboat/${(''+i).padStart(5,'0')}.png` // how can be the image file found, if a frame number (starts from 1) were given +let AUDIOTRACK = 'C:/steamboat.mp2' let AUDIOFORMAT = 'MP2fr' // undefined or PCMu8 or MP2fr // to export video to its frames (with automatic scaling and cropping): // ffmpeg -i file.mp4 -vf scale=560:448:force_original_aspect_ratio=increase,crop=560:448 file/%05d.png diff --git a/lib/aircompressor-0.25-javadoc.jar b/lib/aircompressor-0.25-javadoc.jar new file mode 100644 index 0000000..2490c9f Binary files /dev/null and b/lib/aircompressor-0.25-javadoc.jar differ diff --git a/lib/aircompressor-0.25-sources.jar b/lib/aircompressor-0.25-sources.jar new file mode 100644 index 0000000..619c804 Binary files /dev/null and b/lib/aircompressor-0.25-sources.jar differ diff --git a/lib/aircompressor-0.25.jar b/lib/aircompressor-0.25.jar new file mode 100644 index 0000000..118a22e Binary files /dev/null and b/lib/aircompressor-0.25.jar differ diff --git a/terranmon.txt b/terranmon.txt index 4b20d44..4c867e7 100644 --- a/terranmon.txt +++ b/terranmon.txt @@ -440,26 +440,26 @@ Packet Types - GLOBAL TYPE 0 Packet - uint32 SIZE OF FRAMEDATA - * FRAMEDATA COMPRESSED IN GZIP + * COMPRESSED FRAMEDATA GLOBAL TYPE 1 Packet - byte[512] Palette Data uint32 SIZE OF FRAMEDATA - * FRAMEDATA COMPRESSED IN GZIP + * COMPRESSED FRAMEDATA GLOBAL TYPE 2 Packet - uint32 SIZE OF FRAMEDATA BYTE-PLANE 1 - * FRAMEDATA COMPRESSED IN GZIP + * COMPRESSED FRAMEDATA uint32 SIZE OF FRAMEDATA BYTE-PLANE 2 - * FRAMEDATA COMPRESSED IN GZIP + * COMPRESSED FRAMEDATA GLOBAL iPF Packet - uint32 SIZE OF FRAMEDATA - * FRAMEDATA COMPRESSED IN GZIP // only the actual gzip (and no UNCOMPRESSED SIZE) of the "Blocks.gz" is stored + * COMPRESSED FRAMEDATA // only the actual gzip (and no UNCOMPRESSED SIZE) of the "Blocks.gz" is stored GLOBAL TYPE 16+ Packet - uint32 SIZE OF FRAMEDATA BYTE-PLANE 1 - * FRAMEDATA (COMPRESSED IN GZIP for TGA/GZ) + * FRAMEDATA (COMPRESSED for TGA/GZ) MP2 Packet & ADPCM Packet - uint16 TYPE OF PACKET // follows the Metadata Packet Type scheme @@ -487,6 +487,12 @@ Frame Timing needs explicit "sync" packet for proper frame timing. +Comperssion Method + Old standard used Gzip, new standard is Zstd. + tsvm will read the zip header and will use appropriate decompression method, so that the old Gzipped + files remain compatible. + + NOTE FROM DEVELOPER In the future, the global packet type will be deprecated. diff --git a/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt b/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt index 77ea419..53f0960 100644 --- a/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt @@ -1,6 +1,9 @@ package net.torvald.tsvm import com.badlogic.gdx.utils.compression.Lzma +import io.airlift.compress.zstd.ZstdInputStream +import io.airlift.compress.zstd.ZstdOutputStream +import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.util.zip.GZIPInputStream @@ -77,13 +80,14 @@ class CompressorDelegate(private val vm: VM) { companion object { val GZIP_HEADER = byteArrayOf(31, -117, 8) // .gz in DEFLATE + val ZSTD_HEADER = byteArrayOf(40, -75, 47, -3) fun comp(str: String) = comp(str.toByteArray(VM.CHARSET)) fun comp(ba: ByteArray): ByteArray { val baos = ByteArrayOutputStream() - val gz = GZIPOutputStream(baos) - gz.write(ba); gz.flush(); gz.finish() + val gz = ZstdOutputStream(baos) + gz.write(ba); gz.flush(); gz.close() baos.flush(); baos.close() return baos.toByteArray() } @@ -92,10 +96,16 @@ class CompressorDelegate(private val vm: VM) { fun decomp(str: String) = decomp(str.toByteArray(VM.CHARSET)) fun decomp(ba: ByteArray): ByteArray { + val header = ba[0].toUint().shl(24) or ba[1].toUint().shl(16) or ba[2].toUint().shl(8) or ba[3].toUint() + val bais = ByteArrayInputStream(ba) - val gz = GZIPInputStream(bais) - val ret = gz.readBytes() - gz.close(); bais.close() + val zis = when (header) { + in 0x1F8B0800..0x1F8B08FF -> GZIPInputStream(bais) + 0x28B52FFD -> ZstdInputStream(bais) + else -> throw Error() + } + val ret = zis.readBytes() + zis.close(); bais.close() return ret } } diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt index 91dfdc0..14fae41 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/VMProgramRom.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.files.FileHandle import net.torvald.tsvm.CompressorDelegate import net.torvald.tsvm.CompressorDelegate.Companion.GZIP_HEADER +import net.torvald.tsvm.CompressorDelegate.Companion.ZSTD_HEADER import net.torvald.tsvm.VM import java.io.File import kotlin.experimental.xor @@ -27,9 +28,9 @@ open class VMProgramRom { fun readAll(): String { // check if bios is compressed in gzip - return if (contents.startsWith(byteArrayOf(31, -85, 26))) + return if (contents.startsWith(dec(GZIP_HEADER)) || contents.startsWith(dec(ZSTD_HEADER))) CompressorDelegate.decomp(dec(contents)).toString(VM.CHARSET) - else if (contents.startsWith(GZIP_HEADER)) + else if (contents.startsWith(GZIP_HEADER) || contents.startsWith(ZSTD_HEADER)) CompressorDelegate.decomp(contents).toString(VM.CHARSET) else contents.toString(VM.CHARSET) diff --git a/tsvm_core/tsvm_core.iml b/tsvm_core/tsvm_core.iml index c762ae9..24f0da6 100644 --- a/tsvm_core/tsvm_core.iml +++ b/tsvm_core/tsvm_core.iml @@ -14,5 +14,6 @@ + \ No newline at end of file