Blame exrmaketiled/main.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2012, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
//
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
//
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission.
Packit Service 6754ca
//
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//	exrmaketiled -- program that produces tiled
Packit Service 6754ca
//	multiresolution versions of OpenEXR images.
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include "makeTiled.h"
Packit Service 6754ca
Packit Service 6754ca
#include <iostream>
Packit Service 6754ca
#include <exception>
Packit Service 6754ca
#include <string>
Packit Service 6754ca
#include <string.h>
Packit Service 6754ca
#include <stdlib.h>
Packit Service 6754ca
Packit Service 6754ca
#include "namespaceAlias.h"
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
namespace {
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
usageMessage (const char argv0[], bool verbose = false)
Packit Service 6754ca
{
Packit Service 6754ca
    cerr << "usage: " << argv0 << " [options] infile outfile" << endl;
Packit Service 6754ca
Packit Service 6754ca
    if (verbose)
Packit Service 6754ca
    {
Packit Service 6754ca
        cerr << "\n"
Packit Service 6754ca
        "Reads an OpenEXR image from infile, produces a tiled\n"
Packit Service 6754ca
        "version of the image, and saves the result in outfile.\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "Options:\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-o        produces a ONE_LEVEL image (default)\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-m        produces a MIPMAP_LEVELS multiresolution image\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-r        produces a RIPMAP_LEVELS multiresolution image\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-f c      when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n"
Packit Service 6754ca
        "          is produced, image channel c will be resampled\n"
Packit Service 6754ca
        "          without low-pass filtering.  This option can\n"
Packit Service 6754ca
        "          be specified multiple times to disable low-pass\n"
Packit Service 6754ca
        "          filtering for mutiple channels.\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-e x y    when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n"
Packit Service 6754ca
        "          is produced, low-pass filtering takes samples\n"
Packit Service 6754ca
        "          outside the image's data window.  This requires\n"
Packit Service 6754ca
        "          extrapolating the image.  Option -e specifies\n"
Packit Service 6754ca
        "          how the image is extrapolated horizontally and\n"
Packit Service 6754ca
        "          vertically (black/clamp/periodic/mirror, default\n"
Packit Service 6754ca
        "          is clamp).\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-t x y    sets the tile size in the output image to\n"
Packit Service 6754ca
        "          x by y pixels (default is 64 by 64)\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-d        sets level size rounding to ROUND_DOWN (default)\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-u        sets level size rounding to ROUND_UP\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-z x      sets the data compression method to x\n"
Packit Service 6754ca
        "          (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
Packit Service 6754ca
        "          default is zip)\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-v        verbose mode\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-h        prints this message\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "Multipart Options:\n"
Packit Service 6754ca
        "\n"
Packit Service 6754ca
        "-p i      part number, default is 0\n";
Packit Service 6754ca
Packit Service 6754ca
        cerr << endl;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    exit (1);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Compression
Packit Service 6754ca
getCompression (const string &str)
Packit Service 6754ca
{
Packit Service 6754ca
    Compression c;
Packit Service 6754ca
Packit Service 6754ca
    if (str == "no" || str == "none" || str == "NO" || str == "NONE")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = NO_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "rle" || str == "RLE")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = RLE_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "zip" || str == "ZIP")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = ZIP_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "piz" || str == "PIZ")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = PIZ_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "pxr24" || str == "PXR24")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = PXR24_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "b44" || str == "B44")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = B44_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "b44a" || str == "B44A")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = B44A_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "dwaa" || str == "DWAA")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = DWAA_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "dwab" || str == "DWAB")
Packit Service 6754ca
    {
Packit Service 6754ca
        c = DWAB_COMPRESSION;
Packit Service 6754ca
    }
Packit Service 6754ca
    else
Packit Service 6754ca
    {
Packit Service 6754ca
        cerr << "Unknown compression method \"" << str << "\"." << endl;
Packit Service 6754ca
        exit (1);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    return c;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Extrapolation
Packit Service 6754ca
getExtrapolation (const string &str)
Packit Service 6754ca
{
Packit Service 6754ca
    Extrapolation e;
Packit Service 6754ca
Packit Service 6754ca
    if (str == "black" || str == "BLACK")
Packit Service 6754ca
    {
Packit Service 6754ca
        e = BLACK;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "clamp" || str == "CLAMP")
Packit Service 6754ca
    {
Packit Service 6754ca
        e = CLAMP;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "periodic" || str == "PERIODIC")
Packit Service 6754ca
    {
Packit Service 6754ca
        e = PERIODIC;
Packit Service 6754ca
    }
Packit Service 6754ca
    else if (str == "mirror" || str == "MIRROR")
Packit Service 6754ca
    {
Packit Service 6754ca
        e = MIRROR;
Packit Service 6754ca
    }
Packit Service 6754ca
    else
Packit Service 6754ca
    {
Packit Service 6754ca
        cerr << "Unknown extrapolation method \"" << str << "\"." << endl;
Packit Service 6754ca
        exit (1);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    return e;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
getPartNum (int argc,
Packit Service 6754ca
            char **argv,
Packit Service 6754ca
            int &i,
Packit Service 6754ca
            int *j)
Packit Service 6754ca
{
Packit Service 6754ca
    if (i > argc - 2)
Packit Service 6754ca
        usageMessage (argv[0]);
Packit Service 6754ca
Packit Service 6754ca
    *j = strtol (argv[i + 1], 0, 0);
Packit Service 6754ca
    cout << "part number: "<< *j << endl;
Packit Service 6754ca
    i += 2;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
main(int argc, char **argv)
Packit Service 6754ca
{
Packit Service 6754ca
    const char *inFile = 0;
Packit Service 6754ca
    const char *outFile = 0;
Packit Service 6754ca
    LevelMode mode = ONE_LEVEL;
Packit Service 6754ca
    LevelRoundingMode roundingMode = ROUND_DOWN;
Packit Service 6754ca
    Compression compression = ZIP_COMPRESSION;
Packit Service 6754ca
    int tileSizeX = 64;
Packit Service 6754ca
    int tileSizeY = 64;
Packit Service 6754ca
    set<string> doNotFilter;
Packit Service 6754ca
    Extrapolation extX = CLAMP;
Packit Service 6754ca
    Extrapolation extY = CLAMP;
Packit Service 6754ca
    bool verbose = false;
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Parse the command line.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    if (argc < 2)
Packit Service 6754ca
        usageMessage (argv[0], true);
Packit Service 6754ca
Packit Service 6754ca
    int i = 1;
Packit Service 6754ca
    int partnum = 0;
Packit Service 6754ca
Packit Service 6754ca
    while (i < argc)
Packit Service 6754ca
    {
Packit Service 6754ca
        if (!strcmp (argv[i], "-o"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // generate a ONE_LEVEL image
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            mode = ONE_LEVEL;
Packit Service 6754ca
            i += 1;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-m"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Generate a MIPMAP_LEVELS image
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            mode = MIPMAP_LEVELS;
Packit Service 6754ca
            i += 1;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-r"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Generate a RIPMAP_LEVELS image
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            mode = RIPMAP_LEVELS;
Packit Service 6754ca
            i += 1;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-f"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Don't low-pass filter the specified image channel
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            if (i > argc - 2)
Packit Service 6754ca
                usageMessage (argv[0]);
Packit Service 6754ca
Packit Service 6754ca
            doNotFilter.insert (argv[i + 1]);
Packit Service 6754ca
            i += 2;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-e"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Set x and y extrapolation method
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            if (i > argc - 3)
Packit Service 6754ca
                usageMessage (argv[0]);
Packit Service 6754ca
Packit Service 6754ca
            extX = getExtrapolation (argv[i + 1]);
Packit Service 6754ca
            extY = getExtrapolation (argv[i + 2]);
Packit Service 6754ca
            i += 3;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-t"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Set tile size
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            if (i > argc - 3)
Packit Service 6754ca
                usageMessage (argv[0]);
Packit Service 6754ca
Packit Service 6754ca
            tileSizeX = strtol (argv[i + 1], 0, 0);
Packit Service 6754ca
            tileSizeY = strtol (argv[i + 2], 0, 0);
Packit Service 6754ca
Packit Service 6754ca
            if (tileSizeX <= 0 || tileSizeY <= 0)
Packit Service 6754ca
            {
Packit Service 6754ca
                cerr << "Tile size must be greater than zero." << endl;
Packit Service 6754ca
                return 1;
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
            i += 3;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-d"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Round down
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            roundingMode = ROUND_DOWN;
Packit Service 6754ca
            i += 1;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-u"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Round down
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            roundingMode = ROUND_UP;
Packit Service 6754ca
            i += 1;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-z"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Set compression method
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            if (i > argc - 2)
Packit Service 6754ca
                usageMessage (argv[0]);
Packit Service 6754ca
Packit Service 6754ca
            compression = getCompression (argv[i + 1]);
Packit Service 6754ca
            i += 2;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-v"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Verbose mode
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            verbose = true;
Packit Service 6754ca
            i += 1;
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-h"))
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Print help message
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            usageMessage (argv[0], true);
Packit Service 6754ca
        }
Packit Service 6754ca
        else if (!strcmp (argv[i], "-p"))
Packit Service 6754ca
        {
Packit Service 6754ca
            getPartNum (argc, argv, i, &partnum);
Packit Service 6754ca
        }
Packit Service 6754ca
        else
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // Image file name
Packit Service 6754ca
            //
Packit Service 6754ca
Packit Service 6754ca
            if (inFile == 0)
Packit Service 6754ca
                inFile = argv[i];
Packit Service 6754ca
            else
Packit Service 6754ca
                outFile = argv[i];
Packit Service 6754ca
Packit Service 6754ca
            i += 1;
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    if (inFile == 0 || outFile == 0)
Packit Service 6754ca
        usageMessage (argv[0]);
Packit Service 6754ca
Packit Service 6754ca
    if (!strcmp (inFile, outFile))
Packit Service 6754ca
    {
Packit Service 6754ca
        cerr << "Input and output cannot be the same file." << endl;
Packit Service 6754ca
        return 1;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Load inFile, and save a tiled version in outFile.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    int exitStatus = 0;
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // check input
Packit Service 6754ca
    //
Packit Service 6754ca
    {
Packit Service 6754ca
        MultiPartInputFile input (inFile);
Packit Service 6754ca
        int parts = input.parts();
Packit Service 6754ca
Packit Service 6754ca
        if (partnum < 0 || partnum >= parts){
Packit Service 6754ca
            cerr << "ERROR: you asked for part " << partnum << " in " << inFile;
Packit Service 6754ca
            cerr << ", which only has " << parts << " parts\n";
Packit Service 6754ca
            exit(1);
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        Header h = input.header (partnum);
Packit Service 6754ca
        if (h.type() == DEEPTILE || h.type() == DEEPSCANLINE)
Packit Service 6754ca
        {
Packit Service 6754ca
            cerr << "Cannot make tile for deep data" << endl;
Packit Service 6754ca
            exit(1);
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
        makeTiled (inFile, outFile, partnum,
Packit Service 6754ca
                   mode, roundingMode, compression,
Packit Service 6754ca
                   tileSizeX, tileSizeY,
Packit Service 6754ca
                   doNotFilter,
Packit Service 6754ca
                   extX, extY,
Packit Service 6754ca
                   verbose);
Packit Service 6754ca
    }
Packit Service 6754ca
    catch (const exception &e)
Packit Service 6754ca
    {
Packit Service 6754ca
        cerr << e.what() << endl;
Packit Service 6754ca
        exitStatus = 1;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    return exitStatus;
Packit Service 6754ca
}