Blame exrmultiview/main.cpp

Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
//
Packit 0d464f
// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas
Packit 0d464f
// Digital Ltd. LLC
Packit 0d464f
// 
Packit 0d464f
// All rights reserved.
Packit 0d464f
// 
Packit 0d464f
// Redistribution and use in source and binary forms, with or without
Packit 0d464f
// modification, are permitted provided that the following conditions are
Packit 0d464f
// met:
Packit 0d464f
// *       Redistributions of source code must retain the above copyright
Packit 0d464f
// notice, this list of conditions and the following disclaimer.
Packit 0d464f
// *       Redistributions in binary form must reproduce the above
Packit 0d464f
// copyright notice, this list of conditions and the following disclaimer
Packit 0d464f
// in the documentation and/or other materials provided with the
Packit 0d464f
// distribution.
Packit 0d464f
// *       Neither the name of Industrial Light & Magic nor the names of
Packit 0d464f
// its contributors may be used to endorse or promote products derived
Packit 0d464f
// from this software without specific prior written permission. 
Packit 0d464f
// 
Packit 0d464f
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 0d464f
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 0d464f
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 0d464f
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 0d464f
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 0d464f
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 0d464f
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 0d464f
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 0d464f
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 0d464f
//
Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
Packit 0d464f
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
//
Packit 0d464f
//	exrmultiview -- a program that combines multiple
Packit 0d464f
//	single-view OpenEXR image files into a single
Packit 0d464f
//	multi-view image file.
Packit 0d464f
//
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
Packit 0d464f
#include <makeMultiView.h>
Packit 0d464f
Packit 0d464f
#include <iostream>
Packit 0d464f
#include <exception>
Packit 0d464f
#include <string>
Packit 0d464f
#include <string.h>
Packit 0d464f
#include <stdlib.h>
Packit 0d464f
Packit 0d464f
#include "namespaceAlias.h"
Packit 0d464f
using namespace IMF;
Packit 0d464f
using namespace std;
Packit 0d464f
Packit 0d464f
Packit 0d464f
Packit 0d464f
namespace {
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
usageMessage (const char argv0[], bool verbose = false)
Packit 0d464f
{
Packit 0d464f
    cerr << "usage: " << argv0 << " "
Packit 0d464f
	    "[options] viewname1 infile1 viewname2 infile2 ... outfile" << endl;
Packit 0d464f
Packit 0d464f
    if (verbose)
Packit 0d464f
    {
Packit 0d464f
	cerr << "\n"
Packit 0d464f
		"Combines two or more single-view OpenEXR image files into\n"
Packit 0d464f
		"a single multi-view image file.  On the command line,\n"
Packit 0d464f
		"each single-view input image is specified together with\n"
Packit 0d464f
		"a corresponding view name.  The first view on the command\n"
Packit 0d464f
		"line becomes the default view.  Example:\n"
Packit 0d464f
		"\n"
Packit 0d464f
		"   " << argv0 << " left imgL.exr right imgR.exr imgLR.exr\n"
Packit 0d464f
		"\n"
Packit 0d464f
		"Here, imgL.exr and imgR.exr become the left and right\n"
Packit 0d464f
		"views in output file imgLR.exr.  The left view becomes\n"
Packit 0d464f
		"the default view.\n"
Packit 0d464f
		"\n"
Packit 0d464f
		"Options:\n"
Packit 0d464f
		"\n"
Packit 0d464f
		"-z x      sets the data compression method to x\n"
Packit 0d464f
		"          (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
Packit 0d464f
		"          default is piz)\n"
Packit 0d464f
		"\n"
Packit 0d464f
		"-v        verbose mode\n"
Packit 0d464f
		"\n"
Packit 0d464f
		"-h        prints this message\n";
Packit 0d464f
Packit 0d464f
	 cerr << endl;
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    exit (1);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Compression
Packit 0d464f
getCompression (const string &str)
Packit 0d464f
{
Packit 0d464f
    Compression c;
Packit 0d464f
Packit 0d464f
    if (str == "no" || str == "none" || str == "NO" || str == "NONE")
Packit 0d464f
    {
Packit 0d464f
	c = NO_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "rle" || str == "RLE")
Packit 0d464f
    {
Packit 0d464f
	c = RLE_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "zip" || str == "ZIP")
Packit 0d464f
    {
Packit 0d464f
	c = ZIP_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "piz" || str == "PIZ")
Packit 0d464f
    {
Packit 0d464f
	c = PIZ_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "pxr24" || str == "PXR24")
Packit 0d464f
    {
Packit 0d464f
	c = PXR24_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "b44" || str == "B44")
Packit 0d464f
    {
Packit 0d464f
	c = B44_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "b44a" || str == "B44A")
Packit 0d464f
    {
Packit 0d464f
	c = B44A_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "dwaa" || str == "DWAA")
Packit 0d464f
    {
Packit 0d464f
	c = DWAA_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else if (str == "dwab" || str == "DWAB")
Packit 0d464f
    {
Packit 0d464f
	c = DWAB_COMPRESSION;
Packit 0d464f
    }
Packit 0d464f
    else
Packit 0d464f
    {
Packit 0d464f
	cerr << "Unknown compression method \"" << str << "\"." << endl;
Packit 0d464f
	exit (1);
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    return c;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
} // namespace
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
main(int argc, char **argv)
Packit 0d464f
{
Packit 0d464f
    vector <string> views;
Packit 0d464f
    vector <const char *> inFiles;
Packit 0d464f
    const char *outFile = 0;
Packit 0d464f
    Compression compression = PIZ_COMPRESSION;
Packit 0d464f
    bool verbose = false;
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Parse the command line.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    if (argc < 2)
Packit 0d464f
	usageMessage (argv[0], true);
Packit 0d464f
Packit 0d464f
    int i = 1;
Packit 0d464f
Packit 0d464f
    while (i < argc)
Packit 0d464f
    {
Packit 0d464f
	if (!strcmp (argv[i], "-z"))
Packit 0d464f
	{
Packit 0d464f
	    //
Packit 0d464f
	    // Set compression method
Packit 0d464f
	    //
Packit 0d464f
Packit 0d464f
	    if (i > argc - 2)
Packit 0d464f
		usageMessage (argv[0]);
Packit 0d464f
Packit 0d464f
	    compression = getCompression (argv[i + 1]);
Packit 0d464f
	    i += 2;
Packit 0d464f
	}
Packit 0d464f
	else if (!strcmp (argv[i], "-v"))
Packit 0d464f
	{
Packit 0d464f
	    //
Packit 0d464f
	    // Verbose mode
Packit 0d464f
	    //
Packit 0d464f
Packit 0d464f
	    verbose = true;
Packit 0d464f
	    i += 1;
Packit 0d464f
	}
Packit 0d464f
	else if (!strcmp (argv[i], "-h"))
Packit 0d464f
	{
Packit 0d464f
	    //
Packit 0d464f
	    // Print help message
Packit 0d464f
	    //
Packit 0d464f
Packit 0d464f
	    usageMessage (argv[0], true);
Packit 0d464f
	}
Packit 0d464f
	else
Packit 0d464f
	{
Packit 0d464f
	    //
Packit 0d464f
	    // View or image file name
Packit 0d464f
	    //
Packit 0d464f
Packit 0d464f
	    if (i > argc - 2 || argv[i + 1][0] == '-')
Packit 0d464f
	    {
Packit 0d464f
		//
Packit 0d464f
		// Output file
Packit 0d464f
		//
Packit 0d464f
Packit 0d464f
		if (outFile)
Packit 0d464f
		    usageMessage (argv[0]);
Packit 0d464f
Packit 0d464f
		outFile = argv[i];
Packit 0d464f
		i += 1;
Packit 0d464f
	    }
Packit 0d464f
	    else
Packit 0d464f
	    {
Packit 0d464f
	    	//
Packit 0d464f
		// View plus input file
Packit 0d464f
		//
Packit 0d464f
Packit 0d464f
		views.push_back (argv[i]);
Packit 0d464f
		inFiles.push_back (argv[i + 1]);
Packit 0d464f
		i += 2;
Packit 0d464f
	    }
Packit 0d464f
	}
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    if (views.size() < 2)
Packit 0d464f
    {
Packit 0d464f
	cerr << "Must specify at least two views." << endl;
Packit 0d464f
	return 1;
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    if (outFile == 0)
Packit 0d464f
    {
Packit 0d464f
	cerr << "Must specify an output file." << endl;
Packit 0d464f
	return 1;
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Load inFiles, and save a combined multi-view image in outFile.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    int exitStatus = 0;
Packit 0d464f
Packit 0d464f
    try
Packit 0d464f
    {
Packit 0d464f
	makeMultiView (views, inFiles, outFile, compression, verbose);
Packit 0d464f
    }
Packit 0d464f
    catch (const exception &e)
Packit 0d464f
    {
Packit 0d464f
	cerr << e.what() << endl;
Packit 0d464f
	exitStatus = 1;
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    return exitStatus;
Packit 0d464f
}