Blame IlmImfTest/testInputPart.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
//
Packit Service 6754ca
// Portions (c) 2012, Weta Digital Ltd
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
//         Weta Digital nor any other ontributors may be used to endorse 
Packit Service 6754ca
//         or promote products derived 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
#include <iostream>
Packit Service 6754ca
#include <string>
Packit Service 6754ca
#include <vector>
Packit Service 6754ca
#include <stdio.h>
Packit Service 6754ca
#include <stdlib.h>
Packit Service 6754ca
#include <assert.h>
Packit Service 6754ca
Packit Service 6754ca
#include "tmpDir.h"
Packit Service 6754ca
#include "testInputPart.h"
Packit Service 6754ca
Packit Service 6754ca
#include <IlmThreadPool.h>
Packit Service 6754ca
#include <ImfMultiPartInputFile.h>
Packit Service 6754ca
#include <ImfMultiPartOutputFile.h>
Packit Service 6754ca
#include <ImfArray.h>
Packit Service 6754ca
#include <ImfChannelList.h>
Packit Service 6754ca
#include <ImfOutputPart.h>
Packit Service 6754ca
#include <ImfInputPart.h>
Packit Service 6754ca
#include <ImfTiledOutputPart.h>
Packit Service 6754ca
#include <ImfPartType.h>
Packit Service 6754ca
#include <ImfMisc.h>
Packit Service 6754ca
Packit Service 6754ca
namespace IMF = OPENEXR_IMF_NAMESPACE;
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
using namespace IMATH_NAMESPACE;
Packit Service 6754ca
using namespace ILMTHREAD_NAMESPACE;
Packit Service 6754ca
Packit Service 6754ca
namespace
Packit Service 6754ca
{
Packit Service 6754ca
 
Packit Service 6754ca
const int height = 267;
Packit Service 6754ca
const int width = 193;
Packit Service 6754ca
Packit Service 6754ca
vector<Header> headers;
Packit Service 6754ca
vector<int> pixelTypes;
Packit Service 6754ca
vector<int> partTypes;
Packit Service 6754ca
vector<int> levelModes;
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
void fillPixels (Array2D<T> &ph, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    ph.resizeErase(height, width);
Packit Service 6754ca
    for (int y = 0; y < height; ++y)
Packit Service 6754ca
        for (int x = 0; x < width; ++x)
Packit Service 6754ca
        {
Packit Service 6754ca
            //
Packit Service 6754ca
            // We do this because half cannot store number bigger than 2048 exactly.
Packit Service 6754ca
            //
Packit Service 6754ca
            ph[y][x] = (y * width + x) % 2049;
Packit Service 6754ca
        }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
void fillPixels (Array2D<unsigned int>& sampleCount, Array2D<T*> &ph, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    ph.resizeErase(height, width);
Packit Service 6754ca
    for (int y = 0; y < height; ++y)
Packit Service 6754ca
        for (int x = 0; x < width; ++x)
Packit Service 6754ca
        {
Packit Service 6754ca
            ph[y][x] = new T[sampleCount[y][x]];
Packit Service 6754ca
            for (int i = 0; i < sampleCount[y][x]; i++)
Packit Service 6754ca
            {
Packit Service 6754ca
                //
Packit Service 6754ca
                // We do this because half cannot store number bigger than 2048 exactly.
Packit Service 6754ca
                //
Packit Service 6754ca
                ph[y][x][i] = (y * width + x) % 2049;
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void allocatePixels(int type, Array2D<unsigned int>& sampleCount,
Packit Service 6754ca
                    Array2D<unsigned int*>& uintData, Array2D<float*>& floatData,
Packit Service 6754ca
                    Array2D<half*>& halfData, int x1, int x2, int y1, int y2)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int y = y1; y <= y2; y++)
Packit Service 6754ca
        for (int x = x1; x <= x2; x++)
Packit Service 6754ca
        {
Packit Service 6754ca
            if (type == 0)
Packit Service 6754ca
                uintData[y][x] = new unsigned int[sampleCount[y][x]];
Packit Service 6754ca
            if (type == 1)
Packit Service 6754ca
                floatData[y][x] = new float[sampleCount[y][x]];
Packit Service 6754ca
            if (type == 2)
Packit Service 6754ca
                halfData[y][x] = new half[sampleCount[y][x]];
Packit Service 6754ca
        }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void allocatePixels(int type, Array2D<unsigned int>& sampleCount,
Packit Service 6754ca
                    Array2D<unsigned int*>& uintData, Array2D<float*>& floatData,
Packit Service 6754ca
                    Array2D<half*>& halfData, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    allocatePixels(type, sampleCount, uintData, floatData, halfData, 0, width - 1, 0, height - 1);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void releasePixels(int type, Array2D<unsigned int*>& uintData, Array2D<float*>& floatData,
Packit Service 6754ca
                   Array2D<half*>& halfData, int x1, int x2, int y1, int y2)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int y = y1; y <= y2; y++)
Packit Service 6754ca
        for (int x = x1; x <= x2; x++)
Packit Service 6754ca
        {
Packit Service 6754ca
            if (type == 0)
Packit Service 6754ca
                delete[] uintData[y][x];
Packit Service 6754ca
            if (type == 1)
Packit Service 6754ca
                delete[] floatData[y][x];
Packit Service 6754ca
            if (type == 2)
Packit Service 6754ca
                delete[] halfData[y][x];
Packit Service 6754ca
        }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void releasePixels(int type, Array2D<unsigned int*>& uintData, Array2D<float*>& floatData,
Packit Service 6754ca
                   Array2D<half*>& halfData, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    releasePixels(type, uintData, floatData, halfData, 0, width - 1, 0, height - 1);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
bool checkPixels (Array2D<T> &ph, int lx, int rx, int ly, int ry, int width)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int y = ly; y <= ry; ++y)
Packit Service 6754ca
        for (int x = lx; x <= rx; ++x)
Packit Service 6754ca
            if (ph[y][x] != (y * width + x) % 2049)
Packit Service 6754ca
            {
Packit Service 6754ca
                cout << "value at " << x << ", " << y << ": " << ph[y][x]
Packit Service 6754ca
                     << ", should be " << (y * width + x) % 2049 << endl << flush;
Packit Service 6754ca
                return false;
Packit Service 6754ca
            }
Packit Service 6754ca
    return true;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
bool checkPixels (Array2D<T> &ph, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    return checkPixels<T> (ph, 0, width - 1, 0, height - 1, width);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
bool checkPixels (Array2D<unsigned int>& sampleCount, Array2D<T*> &ph,
Packit Service 6754ca
                  int lx, int rx, int ly, int ry, int width)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int y = ly; y <= ry; ++y)
Packit Service 6754ca
        for (int x = lx; x <= rx; ++x)
Packit Service 6754ca
        {
Packit Service 6754ca
            for (int i = 0; i < sampleCount[y][x]; i++)
Packit Service 6754ca
            {
Packit Service 6754ca
                if (ph[y][x][i] != (y * width + x) % 2049)
Packit Service 6754ca
                {
Packit Service 6754ca
                    cout << "value at " << x << ", " << y << ", sample " << i << ": " << ph[y][x][i]
Packit Service 6754ca
                         << ", should be " << (y * width + x) % 2049 << endl << flush;
Packit Service 6754ca
                    return false;
Packit Service 6754ca
                }
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
    return true;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
bool checkPixels (Array2D<unsigned int>& sampleCount, Array2D<T*> &ph, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    return checkPixels<T> (sampleCount, ph, 0, width - 1, 0, height - 1, width);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
bool checkSampleCount(Array2D<unsigned int>& sampleCount, int x1, int x2, int y1, int y2, int width)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int i = y1; i <= y2; i++)
Packit Service 6754ca
        for (int j = x1; j <= x2; j++)
Packit Service 6754ca
        {
Packit Service 6754ca
            if (sampleCount[i][j] != ((i * width) + j) % 10 + 1)
Packit Service 6754ca
            {
Packit Service 6754ca
                cout << "sample count at " << j << ", " << i << ": " << sampleCount[i][j]
Packit Service 6754ca
                     << ", should be " << (i * width + j) % 10 + 1 << endl << flush;
Packit Service 6754ca
                return false;
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
    return true;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
bool checkSampleCount(Array2D<unsigned int>& sampleCount, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    return checkSampleCount(sampleCount, 0, width - 1, 0, height - 1, width);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void generateRandomHeaders(int partCount, vector<Header>& headers)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "Generating headers and data" << endl << flush;
Packit Service 6754ca
Packit Service 6754ca
    headers.clear();
Packit Service 6754ca
    for (int i = 0; i < partCount; i++)
Packit Service 6754ca
    {
Packit Service 6754ca
        Header header (width, 
Packit Service 6754ca
                       height,
Packit Service 6754ca
                       1.f, 
Packit Service 6754ca
                       IMATH_NAMESPACE::V2f (0, 0), 
Packit Service 6754ca
                       1.f, 
Packit Service 6754ca
                       INCREASING_Y, 
Packit Service 6754ca
                       ZIPS_COMPRESSION);
Packit Service 6754ca
                   
Packit Service 6754ca
        int pixelType = rand() % 3;
Packit Service 6754ca
        int partType = rand() % 2;
Packit Service 6754ca
        
Packit Service 6754ca
        pixelTypes[i] = pixelType;
Packit Service 6754ca
        partTypes[i] = partType;
Packit Service 6754ca
Packit Service 6754ca
        stringstream ss;
Packit Service 6754ca
        ss << i;
Packit Service 6754ca
        header.setName(ss.str());
Packit Service 6754ca
Packit Service 6754ca
        switch (pixelType)
Packit Service 6754ca
        {
Packit Service 6754ca
            case 0:
Packit Service 6754ca
                header.channels().insert("UINT", Channel(IMF::UINT));
Packit Service 6754ca
                break;
Packit Service 6754ca
            case 1:
Packit Service 6754ca
                header.channels().insert("FLOAT", Channel(IMF::FLOAT));
Packit Service 6754ca
                break;
Packit Service 6754ca
            case 2:
Packit Service 6754ca
                header.channels().insert("HALF", Channel(IMF::HALF));
Packit Service 6754ca
                break;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        switch (partType)
Packit Service 6754ca
        {
Packit Service 6754ca
            case 0:
Packit Service 6754ca
                header.setType(SCANLINEIMAGE);
Packit Service 6754ca
                break;
Packit Service 6754ca
            case 1:
Packit Service 6754ca
                header.setType(TILEDIMAGE);
Packit Service 6754ca
                break;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        int tileX;
Packit Service 6754ca
        int tileY;
Packit Service 6754ca
        int levelMode;
Packit Service 6754ca
        if (partType == 1)
Packit Service 6754ca
        {
Packit Service 6754ca
            tileX = rand() % width + 1;
Packit Service 6754ca
            tileY = rand() % height + 1;
Packit Service 6754ca
            levelMode = rand() % 3;
Packit Service 6754ca
            levelModes[i] = levelMode;
Packit Service 6754ca
            LevelMode lm;
Packit Service 6754ca
            switch (levelMode)
Packit Service 6754ca
            {
Packit Service 6754ca
                case 0:
Packit Service 6754ca
                    lm = ONE_LEVEL;
Packit Service 6754ca
                    break;
Packit Service 6754ca
                case 1:
Packit Service 6754ca
                    lm = MIPMAP_LEVELS;
Packit Service 6754ca
                    break;
Packit Service 6754ca
                case 2:
Packit Service 6754ca
                    lm = RIPMAP_LEVELS;
Packit Service 6754ca
                    break;
Packit Service 6754ca
            }
Packit Service 6754ca
            header.setTileDescription(TileDescription(tileX, tileY, lm));
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
 
Packit Service 6754ca
        int order = rand() % NUM_LINEORDERS;
Packit Service 6754ca
        if(partType==0 || partType ==2)
Packit Service 6754ca
        {
Packit Service 6754ca
            // can't write random scanlines
Packit Service 6754ca
            order = rand() % (NUM_LINEORDERS-1);
Packit Service 6754ca
        }
Packit Service 6754ca
        LineOrder l;
Packit Service 6754ca
        switch(order)
Packit Service 6754ca
        {
Packit Service 6754ca
             case 0 : 
Packit Service 6754ca
                 l = INCREASING_Y;
Packit Service 6754ca
                 break;
Packit Service 6754ca
             case 1 :
Packit Service 6754ca
                  l = DECREASING_Y;
Packit Service 6754ca
                 break;
Packit Service 6754ca
             case 2 : 
Packit Service 6754ca
                  l = RANDOM_Y;
Packit Service 6754ca
                  break;
Packit Service 6754ca
        }
Packit Service 6754ca
        
Packit Service 6754ca
        header.lineOrder()=l;
Packit Service 6754ca
        
Packit Service 6754ca
Packit Service 6754ca
        if (partType == 0)
Packit Service 6754ca
        {
Packit Service 6754ca
            cout << "pixelType = " << pixelType << " partType = " << partType
Packit Service 6754ca
                 << " line order =" << header.lineOrder() << endl << flush;
Packit Service 6754ca
        }
Packit Service 6754ca
        else
Packit Service 6754ca
        {
Packit Service 6754ca
            cout << "pixelType = " << pixelType << " partType = " << partType
Packit Service 6754ca
                 << " tile order =" << header.lineOrder()
Packit Service 6754ca
                 << " levelMode = " << levelModes[i] << endl << flush;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        headers.push_back(header);
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void setOutputFrameBuffer(FrameBuffer& frameBuffer, int pixelType,
Packit Service 6754ca
                          Array2D<unsigned int>& uData, Array2D<float>& fData,
Packit Service 6754ca
                          Array2D<half>& hData, int width)
Packit Service 6754ca
{
Packit Service 6754ca
    switch (pixelType)
Packit Service 6754ca
    {
Packit Service 6754ca
        case 0:
Packit Service 6754ca
            frameBuffer.insert ("UINT",
Packit Service 6754ca
                                Slice (IMF::UINT,
Packit Service 6754ca
                                (char *) (&uData[0][0]),
Packit Service 6754ca
                                sizeof (uData[0][0]) * 1,
Packit Service 6754ca
                                sizeof (uData[0][0]) * width));
Packit Service 6754ca
            break;
Packit Service 6754ca
        case 1:
Packit Service 6754ca
            frameBuffer.insert ("FLOAT",
Packit Service 6754ca
                                Slice (IMF::FLOAT,
Packit Service 6754ca
                                (char *) (&fData[0][0]),
Packit Service 6754ca
                                sizeof (fData[0][0]) * 1,
Packit Service 6754ca
                                sizeof (fData[0][0]) * width));
Packit Service 6754ca
            break;
Packit Service 6754ca
        case 2:
Packit Service 6754ca
            frameBuffer.insert ("HALF",
Packit Service 6754ca
                                Slice (IMF::HALF,
Packit Service 6754ca
                                (char *) (&hData[0][0]),
Packit Service 6754ca
                                sizeof (hData[0][0]) * 1,
Packit Service 6754ca
                                sizeof (hData[0][0]) * width));
Packit Service 6754ca
            break;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void setInputFrameBuffer(FrameBuffer& frameBuffer, int pixelType,
Packit Service 6754ca
                         Array2D<unsigned int>& uData, Array2D<float>& fData,
Packit Service 6754ca
                         Array2D<half>& hData, int width, int height)
Packit Service 6754ca
{
Packit Service 6754ca
    switch (pixelType)
Packit Service 6754ca
    {
Packit Service 6754ca
        case 0:
Packit Service 6754ca
            uData.resizeErase(height, width);
Packit Service 6754ca
            frameBuffer.insert ("UINT",
Packit Service 6754ca
                                Slice (IMF::UINT,
Packit Service 6754ca
                                (char *) (&uData[0][0]),
Packit Service 6754ca
                                sizeof (uData[0][0]) * 1,
Packit Service 6754ca
                                sizeof (uData[0][0]) * width,
Packit Service 6754ca
                                1, 1,
Packit Service 6754ca
                                0));
Packit Service 6754ca
            break;
Packit Service 6754ca
        case 1:
Packit Service 6754ca
            fData.resizeErase(height, width);
Packit Service 6754ca
            frameBuffer.insert ("FLOAT",
Packit Service 6754ca
                                Slice (IMF::FLOAT,
Packit Service 6754ca
                                (char *) (&fData[0][0]),
Packit Service 6754ca
                                sizeof (fData[0][0]) * 1,
Packit Service 6754ca
                                sizeof (fData[0][0]) * width,
Packit Service 6754ca
                                1, 1,
Packit Service 6754ca
                                0));
Packit Service 6754ca
            break;
Packit Service 6754ca
        case 2:
Packit Service 6754ca
            hData.resizeErase(height, width);
Packit Service 6754ca
            frameBuffer.insert ("HALF",
Packit Service 6754ca
                                Slice (IMF::HALF,
Packit Service 6754ca
                                (char *) (&hData[0][0]),
Packit Service 6754ca
                                sizeof (hData[0][0]) * 1,
Packit Service 6754ca
                                sizeof (hData[0][0]) * width,
Packit Service 6754ca
                                1, 1,
Packit Service 6754ca
                                0));
Packit Service 6754ca
            break;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
generateRandomFile (int partCount, const std::string & fn)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Init data.
Packit Service 6754ca
    //
Packit Service 6754ca
    Array2D<half> halfData;
Packit Service 6754ca
    Array2D<float> floatData;
Packit Service 6754ca
    Array2D<unsigned int> uintData;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<unsigned int> sampleCount;
Packit Service 6754ca
    Array2D<half*> deepHalfData;
Packit Service 6754ca
    Array2D<float*> deepFloatData;
Packit Service 6754ca
    Array2D<unsigned int*> deepUintData;
Packit Service 6754ca
Packit Service 6754ca
    vector<GenericOutputFile*> outputfiles;
Packit Service 6754ca
Packit Service 6754ca
    pixelTypes.resize(partCount);
Packit Service 6754ca
    partTypes.resize(partCount);
Packit Service 6754ca
    levelModes.resize(partCount);
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Generate headers and data.
Packit Service 6754ca
    //
Packit Service 6754ca
    generateRandomHeaders(partCount, headers);
Packit Service 6754ca
Packit Service 6754ca
    remove(fn.c_str());
Packit Service 6754ca
    MultiPartOutputFile file(fn.c_str(), &headers[0],headers.size());
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Writing files.
Packit Service 6754ca
    //
Packit Service 6754ca
    cout << "Writing files " << flush;
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Pre-generating frameBuffers.
Packit Service 6754ca
    //
Packit Service 6754ca
    for (int i = 0; i < partCount; i++)
Packit Service 6754ca
    {
Packit Service 6754ca
        switch (partTypes[i])
Packit Service 6754ca
        {
Packit Service 6754ca
            case 0:
Packit Service 6754ca
            {
Packit Service 6754ca
                OutputPart part(file, i);
Packit Service 6754ca
Packit Service 6754ca
                FrameBuffer frameBuffer;
Packit Service 6754ca
Packit Service 6754ca
                fillPixels <unsigned int> (uintData, width, height);
Packit Service 6754ca
                fillPixels <float> (floatData, width, height);
Packit Service 6754ca
                fillPixels <half> (halfData, width, height);
Packit Service 6754ca
Packit Service 6754ca
                setOutputFrameBuffer(frameBuffer, pixelTypes[i], uintData, floatData, halfData, width);
Packit Service 6754ca
Packit Service 6754ca
                part.setFrameBuffer(frameBuffer);
Packit Service 6754ca
Packit Service 6754ca
                part.writePixels(height);
Packit Service 6754ca
Packit Service 6754ca
                break;
Packit Service 6754ca
            }
Packit Service 6754ca
            case 1:
Packit Service 6754ca
            {
Packit Service 6754ca
                TiledOutputPart part(file, i);
Packit Service 6754ca
Packit Service 6754ca
                int numXLevels = part.numXLevels();
Packit Service 6754ca
                int numYLevels = part.numYLevels();
Packit Service 6754ca
Packit Service 6754ca
                for (int xLevel = 0; xLevel < numXLevels; xLevel++)
Packit Service 6754ca
                    for (int yLevel = 0; yLevel < numYLevels; yLevel++)
Packit Service 6754ca
                    {
Packit Service 6754ca
                        if (!part.isValidLevel(xLevel, yLevel))
Packit Service 6754ca
                            continue;
Packit Service 6754ca
Packit Service 6754ca
                        int w = part.levelWidth(xLevel);
Packit Service 6754ca
                        int h = part.levelHeight(yLevel);
Packit Service 6754ca
Packit Service 6754ca
                        FrameBuffer frameBuffer;
Packit Service 6754ca
Packit Service 6754ca
                        fillPixels <unsigned int> (uintData, w, h);
Packit Service 6754ca
                        fillPixels <float> (floatData, w, h);
Packit Service 6754ca
                        fillPixels <half> (halfData, w, h);
Packit Service 6754ca
                        setOutputFrameBuffer(frameBuffer, pixelTypes[i],
Packit Service 6754ca
                                             uintData, floatData, halfData,
Packit Service 6754ca
                                             w);
Packit Service 6754ca
Packit Service 6754ca
                        part.setFrameBuffer(frameBuffer);
Packit Service 6754ca
Packit Service 6754ca
                        part.writeTiles(0, part.numXTiles(xLevel) - 1,
Packit Service 6754ca
                                        0, part.numYTiles(yLevel) - 1,
Packit Service 6754ca
                                        xLevel, yLevel);
Packit Service 6754ca
                    }
Packit Service 6754ca
Packit Service 6754ca
                break;
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readWholeFiles (const std::string & fn)
Packit Service 6754ca
{
Packit Service 6754ca
    Array2D<unsigned int> uData;
Packit Service 6754ca
    Array2D<float> fData;
Packit Service 6754ca
    Array2D<half> hData;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<unsigned int*> deepUData;
Packit Service 6754ca
    Array2D<float*> deepFData;
Packit Service 6754ca
    Array2D<half*> deepHData;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<unsigned int> sampleCount;
Packit Service 6754ca
Packit Service 6754ca
    MultiPartInputFile file(fn.c_str());
Packit Service 6754ca
    for (size_t i = 0; i < file.parts(); i++)
Packit Service 6754ca
    {
Packit Service 6754ca
        const Header& header = file.header(i);
Packit Service 6754ca
        assert (header.displayWindow() == headers[i].displayWindow());
Packit Service 6754ca
        assert (header.dataWindow() == headers[i].dataWindow());
Packit Service 6754ca
        assert (header.pixelAspectRatio() == headers[i].pixelAspectRatio());
Packit Service 6754ca
        assert (header.screenWindowCenter() == headers[i].screenWindowCenter());
Packit Service 6754ca
        assert (header.screenWindowWidth() == headers[i].screenWindowWidth());
Packit Service 6754ca
        assert (header.lineOrder() == headers[i].lineOrder());
Packit Service 6754ca
        assert (header.compression() == headers[i].compression());
Packit Service 6754ca
        assert (header.channels() == headers[i].channels());
Packit Service 6754ca
        assert (header.name() == headers[i].name());
Packit Service 6754ca
        assert (header.type() == headers[i].type());
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    cout << "Reading whole files " << flush;
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Shuffle part numbers.
Packit Service 6754ca
    //
Packit Service 6754ca
    vector<int> shuffledPartNumber;
Packit Service 6754ca
    for (int i = 0; i < headers.size(); i++)
Packit Service 6754ca
        shuffledPartNumber.push_back(i);
Packit Service 6754ca
    for (int i = 0; i < headers.size(); i++)
Packit Service 6754ca
    {
Packit Service 6754ca
        int a = rand() % headers.size();
Packit Service 6754ca
        int b = rand() % headers.size();
Packit Service 6754ca
        swap (shuffledPartNumber[a], shuffledPartNumber[b]);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Start reading whole files.
Packit Service 6754ca
    //
Packit Service 6754ca
    int i;
Packit Service 6754ca
    int partNumber;
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
        for (i = 0; i < headers.size(); i++)
Packit Service 6754ca
        {
Packit Service 6754ca
            partNumber = shuffledPartNumber[i];
Packit Service 6754ca
            FrameBuffer frameBuffer;
Packit Service 6754ca
            setInputFrameBuffer(frameBuffer, pixelTypes[partNumber],
Packit Service 6754ca
                                uData, fData, hData, width, height);
Packit Service 6754ca
Packit Service 6754ca
             InputPart part(file, partNumber);
Packit Service 6754ca
             part.setFrameBuffer(frameBuffer);
Packit Service 6754ca
             part.readPixels(0, height - 1);
Packit Service 6754ca
             switch (pixelTypes[partNumber])
Packit Service 6754ca
             {
Packit Service 6754ca
                   case 0:
Packit Service 6754ca
                        assert(checkPixels<unsigned int>(uData, width, height));
Packit Service 6754ca
                        break;
Packit Service 6754ca
                   case 1:
Packit Service 6754ca
                        assert(checkPixels<float>(fData, width, height));
Packit Service 6754ca
                        break;
Packit Service 6754ca
                    case 2:
Packit Service 6754ca
                        assert(checkPixels<half>(hData, width, height));
Packit Service 6754ca
                        break;
Packit Service 6754ca
             }
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
    catch (...)
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "Error while reading part " << partNumber << endl << flush;
Packit Service 6754ca
        throw;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readFirstPart (const std::string & fn)
Packit Service 6754ca
{
Packit Service 6754ca
    Array2D<unsigned int> uData;
Packit Service 6754ca
    Array2D<float> fData;
Packit Service 6754ca
    Array2D<half> hData;
Packit Service 6754ca
    
Packit Service 6754ca
    Array2D<unsigned int*> deepUData;
Packit Service 6754ca
    Array2D<float*> deepFData;
Packit Service 6754ca
    Array2D<half*> deepHData;
Packit Service 6754ca
    
Packit Service 6754ca
    Array2D<unsigned int> sampleCount;
Packit Service 6754ca
    
Packit Service 6754ca
    cout << "Reading first part " << flush;
Packit Service 6754ca
    int pixelType = pixelTypes[0];
Packit Service 6754ca
    int levelMode = levelModes[0];
Packit Service 6754ca
Packit Service 6754ca
    int l1, l2;
Packit Service 6754ca
    l1 = rand() % height;
Packit Service 6754ca
    l2 = rand() % height;
Packit Service 6754ca
    if (l1 > l2) swap(l1, l2);
Packit Service 6754ca
Packit Service 6754ca
    InputFile part(fn.c_str());
Packit Service 6754ca
Packit Service 6754ca
    FrameBuffer frameBuffer;
Packit Service 6754ca
    setInputFrameBuffer(frameBuffer, pixelType,
Packit Service 6754ca
                        uData, fData, hData, width, height);
Packit Service 6754ca
Packit Service 6754ca
    part.setFrameBuffer(frameBuffer);
Packit Service 6754ca
    part.readPixels(l1, l2);
Packit Service 6754ca
Packit Service 6754ca
    switch (pixelType)
Packit Service 6754ca
    {
Packit Service 6754ca
       case 0:
Packit Service 6754ca
          assert(checkPixels<unsigned int>(uData, 0, width - 1, l1, l2, width));
Packit Service 6754ca
          break;
Packit Service 6754ca
       case 1:
Packit Service 6754ca
            assert(checkPixels<float>(fData, 0, width - 1, l1, l2, width));
Packit Service 6754ca
            break;
Packit Service 6754ca
       case 2:
Packit Service 6754ca
            assert(checkPixels<half>(hData, 0, width - 1, l1, l2, width));
Packit Service 6754ca
            break;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
readPartialFiles (int randomReadCount, const std::string & fn)
Packit Service 6754ca
{
Packit Service 6754ca
    Array2D<unsigned int> uData;
Packit Service 6754ca
    Array2D<float> fData;
Packit Service 6754ca
    Array2D<half> hData;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<unsigned int*> deepUData;
Packit Service 6754ca
    Array2D<float*> deepFData;
Packit Service 6754ca
    Array2D<half*> deepHData;
Packit Service 6754ca
Packit Service 6754ca
    Array2D<unsigned int> sampleCount;
Packit Service 6754ca
Packit Service 6754ca
    cout << "Reading partial files " << flush;
Packit Service 6754ca
    MultiPartInputFile file(fn.c_str());
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < randomReadCount; i++)
Packit Service 6754ca
    {
Packit Service 6754ca
        int partNumber = rand() % file.parts();
Packit Service 6754ca
        int partType = partTypes[partNumber];
Packit Service 6754ca
        int pixelType = pixelTypes[partNumber];
Packit Service 6754ca
        int levelMode = levelModes[partNumber];
Packit Service 6754ca
Packit Service 6754ca
        int l1, l2;
Packit Service 6754ca
        l1 = rand() % height;
Packit Service 6754ca
        l2 = rand() % height;
Packit Service 6754ca
        
Packit Service 6754ca
        if (l1 > l2) swap(l1, l2);
Packit Service 6754ca
Packit Service 6754ca
        InputPart part(file, partNumber);
Packit Service 6754ca
Packit Service 6754ca
        FrameBuffer frameBuffer;
Packit Service 6754ca
        setInputFrameBuffer(frameBuffer, pixelType,
Packit Service 6754ca
                            uData, fData, hData, width, height);
Packit Service 6754ca
Packit Service 6754ca
        part.setFrameBuffer(frameBuffer);
Packit Service 6754ca
        part.readPixels(l1, l2);
Packit Service 6754ca
Packit Service 6754ca
        switch (pixelType)
Packit Service 6754ca
        {
Packit Service 6754ca
              case 0:
Packit Service 6754ca
                  assert(checkPixels<unsigned int>(uData, 0, width - 1, l1, l2, width));
Packit Service 6754ca
                  break;
Packit Service 6754ca
              case 1:
Packit Service 6754ca
                  assert(checkPixels<float>(fData, 0, width - 1, l1, l2, width));
Packit Service 6754ca
                  break;
Packit Service 6754ca
              case 2:
Packit Service 6754ca
                  assert(checkPixels<half>(hData, 0, width - 1, l1, l2, width));
Packit Service 6754ca
                  break;
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
testWriteRead (int partNumber,
Packit Service 6754ca
               int runCount,
Packit Service 6754ca
               int randomReadCount,
Packit Service 6754ca
               const std::string & tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "Testing file with " << partNumber << " part(s)." << endl << flush;
Packit Service 6754ca
Packit Service 6754ca
    const std::string fn = tempDir + "imf_test_input_part.exr";
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < runCount; i++)
Packit Service 6754ca
    {
Packit Service 6754ca
        generateRandomFile (partNumber, fn);
Packit Service 6754ca
        readWholeFiles (fn);
Packit Service 6754ca
        readFirstPart (fn);
Packit Service 6754ca
        readPartialFiles (randomReadCount, fn);
Packit Service 6754ca
Packit Service 6754ca
        remove (fn.c_str());
Packit Service 6754ca
Packit Service 6754ca
        cout << endl << flush;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void testInputPart (const std::string & tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "Testing reading multipart tiles and scanlines with InputPart" << endl;
Packit Service 6754ca
Packit Service 6754ca
        srand(1);
Packit Service 6754ca
Packit Service 6754ca
        int numThreads = ThreadPool::globalThreadPool().numThreads();
Packit Service 6754ca
        ThreadPool::globalThreadPool().setNumThreads(4);
Packit Service 6754ca
Packit Service 6754ca
        testWriteRead ( 1, 1,  5, tempDir);
Packit Service 6754ca
        testWriteRead ( 2, 2,  1, tempDir);
Packit Service 6754ca
        testWriteRead ( 8, 4,  2, tempDir);
Packit Service 6754ca
        testWriteRead (50, 3, 11, tempDir);
Packit Service 6754ca
Packit Service 6754ca
        ThreadPool::globalThreadPool().setNumThreads(numThreads);
Packit Service 6754ca
Packit Service 6754ca
        cout << "ok\n" << endl;
Packit Service 6754ca
    }
Packit Service 6754ca
    catch (const std::exception &e)
Packit Service 6754ca
    {
Packit Service 6754ca
        cerr << "ERROR -- caught exception: " << e.what() << endl;
Packit Service 6754ca
        assert (false);
Packit Service 6754ca
    }
Packit Service 6754ca
}