Skip to content
Snippets Groups Projects
DataCompressor.java 6.65 KiB
package azgracompress;

import azgracompress.benchmark.CompressionBenchmark;
import azgracompress.cli.CliConstants;
import azgracompress.cli.ParsedCliOptions;
import azgracompress.compression.ImageCompressor;
import azgracompress.compression.ImageDecompressor;
import org.apache.commons.cli.*;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

public class DataCompressor {


    public static void main(String[] args) {
        Options options = getOptions();

        HelpFormatter formatter = new HelpFormatter();
        CommandLineParser parser = new DefaultParser();
        CommandLine cmd;
        try {
            cmd = parser.parse(options, args);
        } catch (ParseException e) {
            if ((args.length > 0) && (args[0].equals("-h") || args[0].equals("--help"))) {
                formatter.printHelp(CliConstants.MAIN_HELP, options);
                return;
            }
            System.err.println("Error: " + e.getMessage());
            return;
        }

        ParsedCliOptions parsedCliOptions = new ParsedCliOptions(cmd);
        if (parsedCliOptions.hasErrorOccured()) {
            System.err.println(parsedCliOptions.getError());
            return;
        }

        if (parsedCliOptions.isVerbose()) {
            System.out.println(parsedCliOptions.report());
        }

        switch (parsedCliOptions.getMethod()) {

            case Compress: {
                ImageCompressor compressor = new ImageCompressor(parsedCliOptions);
                if (!compressor.compress()) {
                    System.err.println("Errors occurred during compression.");
                }
                return;
            }
            case Decompress: {
                ImageDecompressor decompressor = new ImageDecompressor(parsedCliOptions);
                if (!decompressor.decompress()) {
                    System.err.println("Errors occurred during decompression.");
                }
                return;
            }
            case Benchmark: {
                CompressionBenchmark.runBenchmark(parsedCliOptions);
                return;
            }
            case TrainCodebook: {
                ImageCompressor compressor = new ImageCompressor(parsedCliOptions);
                if (!compressor.trainAndSaveCodebook()) {
                    System.err.println("Errors occurred during training/saving of codebook.");
                }
                return;
            }
            case PrintHelp: {
                formatter.printHelp(CliConstants.MAIN_HELP, options);
            }
            break;
            case InspectFile: {
                ImageDecompressor decompressor = new ImageDecompressor(parsedCliOptions);
                try {
                    System.out.println(decompressor.inspectCompressedFile());
                } catch (IOException e) {
                    System.err.println("Errors occurred during inspecting file.");
                    System.err.println(e.getMessage());
                    e.printStackTrace();
                }
                return;
            }
        }
        return;
    }

    @NotNull
    private static Options getOptions() {
        Options options = new Options();

        OptionGroup methodGroup = new OptionGroup();
        methodGroup.setRequired(true);
        methodGroup.addOption(new Option(CliConstants.COMPRESS_SHORT,
                                         CliConstants.COMPRESS_LONG,
                                         false,
                                         "Compress 16 bit raw image"));
        methodGroup.addOption(new Option(CliConstants.DECOMPRESS_SHORT,
                                         CliConstants.DECOMPRESS_LONG,
                                         false,
                                         "Decompress 16 bit raw image"));
        methodGroup.addOption(new Option(CliConstants.INSPECT_SHORT,
                                         CliConstants.INSPECT_LONG,
                                         false,
                                         "Inspect the compressed file"));

        methodGroup.addOption(new Option(CliConstants.BENCHMARK_SHORT,
                                         CliConstants.BENCHMARK_LONG,
                                         false,
                                         "Benchmark"));

        methodGroup.addOption(new Option(CliConstants.TRAIN_SHORT,
                                         CliConstants.TRAIN_LONG,
                                         false,
                                         "Train codebook and save learned codebook to cache file."));

        methodGroup.addOption(new Option(CliConstants.HELP_SHORT, CliConstants.HELP_LONG, false, "Print help"));

        OptionGroup compressionMethodGroup = new OptionGroup();
        compressionMethodGroup.addOption(new Option(CliConstants.SCALAR_QUANTIZATION_SHORT,
                                                    CliConstants.SCALAR_QUANTIZATION_LONG,
                                                    false,
                                                    "Use scalar quantization."));

        compressionMethodGroup.addOption(new Option(CliConstants.VECTOR_QUANTIZATION_SHORT,
                                                    CliConstants.VECTOR_QUANTIZATION_LONG,
                                                    true,
                                                    "Use vector quantization. Need to pass vector size eg. 9,9x1,3x3"));

        options.addOptionGroup(methodGroup);
        options.addOptionGroup(compressionMethodGroup);
        options.addOption(CliConstants.BITS_SHORT, CliConstants.BITS_LONG, true, "Bit count per pixel [Default 8]");

        options.addOption(CliConstants.REFERENCE_PLANE_SHORT,
                          CliConstants.REFERENCE_PLANE_LONG,
                          true,
                          "Reference plane index");

        options.addOption(new Option(CliConstants.VERBOSE_SHORT,
                                     CliConstants.VERBOSE_LONG,
                                     false,
                                     "Make program verbose"));

        options.addOption(new Option(CliConstants.WORKER_COUNT_SHORT,
                                     CliConstants.WORKER_COUNT_LONG,
                                     true,
                                     "Number of worker threads"));

        options.addOption(new Option(CliConstants.CODEBOOK_CACHE_FOLDER_SHORT,
                                     CliConstants.CODEBOOK_CACHE_FOLDER_LONG,
                                     true,
                                     "Folder of codebook caches"));

        options.addOption(CliConstants.OUTPUT_SHORT, CliConstants.OUTPUT_LONG, true, "Custom output file");
        return options;
    }
}