A decoder and utility for the Flipnote Studios .ppm animation format

Overview

🗃 para

assets/para.png

What?

A decoder and utility for the Flipnote Studios .ppm animation format.

Why this implementation over the original?

This implementation is

  • SIGNIFICANTLY faster,
  • implemented in safe Rust (a language with strict type-checking!),
  • and being actively updated.

Speed

In a two-hundred-forty-four frame .ppm benchmark running the command $ para ./benchmark.ppm gif benchmark.gif on a twelve-core, twenty-four-thread Ryzen 9 processor, para took an average of 603.3459 milliseconds, while ppm-parser took an average of 50.4171397 seconds.

Running the command $ para ./benchmark.ppm 0 benchmark.png on a twelve-core, twenty-four-thread Ryzen 9 processor, para took an average of 8.9794 milliseconds, while ppm-parser took an average of 358.2232 milliseconds.

Rust versus Python isn't very fair, however, this benchmark shows the speed improvements that para brings to the table.

Things To Come

  • Support for other formats (namely .kwz)
  • Optimizations here and there
  • Friendlier CLI
  • Possible GUI

Getting up and Running

Installation

Prebuilt binaries for x86_64-based Linux systems and Windows are available in the releases. If you are using a different operating system or architecture such as macOS, you'll have to build and install the tool yourself!

$ cargo install --git https://github.com/Usugata/para --branch main

If you are building and installing yourself, you must have Rust installed!

Usage

usage:  para <in> <index option> <out>
index options:
        gif
        thumb
        dump
        integer(u16)

Examples

  • $ para ./example.ppm 23 example.png will output the twenty-fourth frame of example.ppm to example.png
  • $ para ./example.ppm thumb example.png will output the thumbnail of example.ppm to example.png
  • $ para ./example.ppm dump example.json will output the metadata of example.ppm to example.json
  • $ para ./example.ppm gif example.gif will output example.ppm to example.gif

Prebuilt Binaries

Prebuilt binaries for the latest release may or may not be found here.

Credits

  • jaames for completing PPM reverse-engineering and writing the original implementation.
  • bricklife, mirai-iro, harimau_tigris, and other members of the Japanese Flipnote community who started reverse-engineering the PPM format almost as soon as the app was released.
  • Midmad and WDLMaster for identifying the adpcm sound codec used.
  • steven and yellows8 for the PPM documentation on DSiBrew.
  • PBSDS for more PPM reverse-engineering, as well as writing hatenatools

License

MIT License

You might also like...
Verbump - A simple utility written in rust to bump and manage git semantic version tags.

Verbump - A simple utility written in rust to bump and manage git semantic version tags.

Batch rename utility for developers
Batch rename utility for developers

nomino Batch rename utility for developers How to install Pre-Compiled You can download a pre-compiled executable for Linux, MacOS and Windows operati

mdTranslation is a utility to prepare multi-lingual Markdown documents.

mdTranslation is a utility to prepare multi-lingual Markdown documents. There's also a mdBook preprocessor called mdbook-translation for

ᎩᎦᎨᎢ (IPA: [gigagei]) is a random quote fetching console utility. Written in Rust.
ᎩᎦᎨᎢ (IPA: [gigagei]) is a random quote fetching console utility. Written in Rust.

gigagei ᎩᎦᎨᎢ (IPA: [gigagei]) is a random quote fetching console utility. Written in Rust. Installing Use latest pre-built binary from releases Buildi

Utility library to work with tuples.

Utility library to work with tuples.

Devmode is a project management utility for developers.
Devmode is a project management utility for developers.

Dev(mode) Dev(mode) is a project management utility for developers.

A fast, multi-threaded line counting utility written in Rust.

xloc A fast, multi-threaded line counting utility written in Rust. What is xloc A drop in replacement for bash's wc -l. Your project has x lines of co

Provides utility functions to perform a graceful shutdown on an tokio-rs based service

tokio-graceful-shutdown IMPORTANT: This crate is in an early stage and not ready for production. This crate provides utility functions to perform a gr

A cli utility written in Rust that allows fetching all the labels of a project, save those as a YAML file

A cli utility written in Rust that allows fetching all the labels of a project, save those as a YAML file that you can easily edit or save as backup and apply a saved preset to new repositories.

Releases(0.1.0)
Owner
Usugata
Nintendo Homebrew and Utility Studio
Usugata
Convert an MCU register description from the EDC format to the SVD format

edc2svd Convert an MCU register description from the EDC format to the SVD format EDC files are used to describe the special function registers of PIC

Stephan 4 Oct 9, 2021
An ND812 decoder implemented as part of the yaxpeax project

yaxpeax-nd812 an ND812 decoder implemented as part of the yaxpeax project, including traits provided by yaxpeax-arch. the ND812 is a 12-bit microcompu

iximeow 1 Jan 22, 2022
A basic rust QOI decoder/encoder

libqoi A basic rust QOI decoder/encoder. Why QOI QOI is a lossless image format with a one page specification. It can achieve better compression than

null 2 May 21, 2022
Small utility to display hour in a binary format on the Novation's Launchpad X.

lpx-binary-clock Small utility to display hour in a binary format on the Novation's Launchpad X. Hours, minutes and seconds are displayed one digit pe

Alexis LOUIS 1 Feb 13, 2022
This crate allows writing a struct in Rust and have it derive a struct of arrays layed out in memory according to the arrow format.

Arrow2-derive - derive for Arrow2 This crate allows writing a struct in Rust and have it derive a struct of arrays layed out in memory according to th

Jorge Leitao 29 Dec 27, 2022
Serializer and deserializer for the VCR Cassette format

vcr-cassette Serializer and deserializer for the VCR Cassette format API Docs | Releases | Contributing Examples Given the following .json VCR Cassett

http-rs 12 Sep 15, 2021
transmute-free Rust library to work with the Arrow format

Arrow2: Transmute-free Arrow This repository contains a Rust library to work with the Arrow format. It is a re-write of the official Arrow crate using

Jorge Leitao 708 Dec 30, 2022
IDX is a Rust crate for working with RuneScape .idx-format caches.

This image proudly made in GIMP License Licensed under GNU GPL, Version 3.0, (LICENSE-GPL3 or https://choosealicense.com/licenses/gpl-3.0/) Contributi

Ceikry 5 May 27, 2022
Parses .off (Object File Format) files. This implementation follows this spec from the Princeton Shape Benchmark.

off-rs - A simple .off file parser Parses .off (Object File Format) files. This implementation follows this spec from the Princeton Shape Benchmark. S

Michael Lohr 2 Jun 12, 2022
A small utility for tracking the change in opening and closing of issues in a GitHub repo

A small utility for tracking the change in opening and closing of issues in a GitHub repo. This tool can be used to build visualizations for issue triage over time with the hope of motivating closing more issues than are opened.

Ryan Levick 12 Sep 29, 2021