Continuously Tested and Benchmarked

Continuously tested and benchmarked across a wide selection of platforms and hardware, to give you the best performance with the least hassle. Want to see all the green builds, take a look at the current test status.

Cross-platform Hardware Acceleration

Whether you care about the highest coding throughput or the lowest coding processing utilization we provide it across all platforms, be it Android, iOS, Linux, Windows, MacOS, etc.

Well documented and friendly APIs

Convenient APIs, good documentation and examples gives you the ability to quickly start using our library and integrate it into your solution.

Getting Started

In the following example some data object is put into an encoder on the sending side, the encoder produces payloads that are transported over a lossy network. On the receiving side, received payloads are inserted into a decoder until enough payloads have been accumulated to recreate the original data object.


#include <algorithm> 
#include <cstdint>
#include <iostream>
#include <vector>

#include <kodo_reed_solomon/codes.hpp>

int main()
{
	// Define some parameters including the finite field,
	// the number of symbols and the symbol size.
	fifi::finite_field field = fifi::finite_field::binary8;
	uint32_t symbols = 42;
	uint32_t symbol_size = 160;

	// Create an encoder and a decoder using the specified parameters
	kodo_reed_solomon::encoder encoder(field, symbols, symbol_size);
	kodo_reed_solomon::decoder decoder(field, symbols, symbol_size);

	// Allocate some data to be sent and assign it to the encoder
	std::vector<uint8_t> data_in(encoder.block_size());
	std::generate(data_in.begin(), data_in.end(), rand);
	encoder.set_symbols_storage(data_in.data());

	// Define a buffer where the symbols should be decoded
	std::vector<uint8_t> data_out(decoder.block_size());
	decoder.set_symbols_storage(data_out.data());

	// Allocate storage for a payload to be sent over a network.
	std::vector<uint8_t> payload(encoder.max_payload_size());

	while (!decoder.is_complete())
	{
		// Encode a packet into the payload buffer
		encoder.produce_payload(payload.data());

		// Lose a packet with 50% probability
		if (rand() % 100 < 50)
			continue;

		// Pass the packet to the decoder
		decoder.consume_payload(payload.data());
	}

	// Check that decoding succeseded
	if (std::equal(data_out.begin(), data_out.end(), data_in.begin()))
		std::cout << "Data decoded correctly" << std::endl;
	else
		std::cout << "Decoding failed, please file a bug report." << std::endl;
}

Documentation

Ready to start coding? Just follow this short guide and take a look at these examples. You should also take a look at the API documentation.

Pricing

Whether you are a researcher, or small or large cooperation we got a plan for you.

Research Startup Growth Scale
Revenue Cap Maximum yearly revenue of your organization and its affiliates N/A < $5M   < $25M < $250M
Updates
Commercial use
Support Answer within 2 business days Priority support
Warranty
Cost (Monthly) Free $3,000 $10,000
Cost (Yearly) Pay yearly in advance for a discount Free $30,000 $100,000

Get in contact

If you have a question or none of the above plans fit your needs, leave us a message and we will contact you.

Contact