Blame IlmImfTest/testDeepScanLineMultipleRead.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (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 Weta Digital 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
#include "testCompositeDeepScanLine.h"
Packit Service 6754ca
Packit Service 6754ca
#include <ImfDeepScanLineOutputFile.h>
Packit Service 6754ca
#include <ImfDeepScanLineInputFile.h>
Packit Service 6754ca
#include <ImfChannelList.h>
Packit Service 6754ca
#include <ImfPartType.h>
Packit Service 6754ca
#include <ImfDeepFrameBuffer.h>
Packit Service 6754ca
#include <ImfHeader.h>
Packit Service 6754ca
#include <ImfNamespace.h>
Packit Service 6754ca
Packit Service 6754ca
#include <vector>
Packit Service 6754ca
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
Packit Service 6754ca
namespace{
Packit Service 6754ca
Packit Service 6754ca
const char source_filename[] = IMF_TMP_DIR "imf_test_multiple_read.exr";
Packit Service 6754ca
    
Packit Service 6754ca
using std::cout;
Packit Service 6754ca
using std::endl;
Packit Service 6754ca
using std::flush;
Packit Service 6754ca
using std::vector;
Packit Service 6754ca
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::Header;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::Channel;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::UINT;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::FLOAT;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::DEEPSCANLINE;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::ZIPS_COMPRESSION;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::DeepScanLineOutputFile;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::DeepScanLineInputFile;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::DeepFrameBuffer;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::Slice;
Packit Service 6754ca
using OPENEXR_IMF_NAMESPACE::DeepSlice;
Packit Service 6754ca
using IMATH_NAMESPACE::Box2i;
Packit Service 6754ca
Packit Service 6754ca
namespace IMF = OPENEXR_IMF_NAMESPACE;
Packit Service 6754ca
Packit Service 6754ca
static void 
Packit Service 6754ca
make_file(const char * filename)
Packit Service 6754ca
{
Packit Service 6754ca
    
Packit Service 6754ca
    int width=4;
Packit Service 6754ca
    int height=48;
Packit Service 6754ca
    
Packit Service 6754ca
    //
Packit Service 6754ca
    // create a deep output file of widthxheight, where each pixel has 'y' samples,
Packit Service 6754ca
    // each with value 'x'
Packit Service 6754ca
    //
Packit Service 6754ca
    
Packit Service 6754ca
    Header header( width,height);
Packit Service 6754ca
    header.channels().insert("Z", Channel(IMF::FLOAT));
Packit Service 6754ca
    header.compression()=ZIPS_COMPRESSION;
Packit Service 6754ca
    header.setType(DEEPSCANLINE);
Packit Service 6754ca
        
Packit Service 6754ca
    remove (filename);
Packit Service 6754ca
    DeepScanLineOutputFile file(filename, header);
Packit Service 6754ca
    
Packit Service 6754ca
    unsigned int sample_count; 
Packit Service 6754ca
    float sample;
Packit Service 6754ca
    float * sample_ptr = &sample; 
Packit Service 6754ca
    
Packit Service 6754ca
    DeepFrameBuffer fb;
Packit Service 6754ca
    
Packit Service 6754ca
    fb.insertSampleCountSlice(Slice(IMF::UINT,(char *)&sample_count));
Packit Service 6754ca
    fb.insert("Z",DeepSlice(IMF::FLOAT,(char *) &sample_ptr));
Packit Service 6754ca
    
Packit Service 6754ca
    
Packit Service 6754ca
    file.setFrameBuffer(fb);
Packit Service 6754ca
    
Packit Service 6754ca
    for( int y=0 ; y < height ; y++ )
Packit Service 6754ca
    {
Packit Service 6754ca
        //
Packit Service 6754ca
        // ensure each scanline contains a different number of samples,
Packit Service 6754ca
        // with different values. We don't care that each sample has the same
Packit Service 6754ca
        // value, or that each pixel on the scanline is identical
Packit Service 6754ca
        //
Packit Service 6754ca
        sample_count = y;
Packit Service 6754ca
        sample = y+100.0;
Packit Service 6754ca
        
Packit Service 6754ca
        file.writePixels(1);
Packit Service 6754ca
        
Packit Service 6754ca
    }
Packit Service 6754ca
    
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
static void read_file(const char * filename)
Packit Service 6754ca
{
Packit Service 6754ca
    DeepScanLineInputFile file(filename);
Packit Service 6754ca
    
Packit Service 6754ca
    Box2i datawin = file.header().dataWindow();
Packit Service 6754ca
    int width = datawin.size().x+1;
Packit Service 6754ca
    int height = datawin.size().y+1;
Packit Service 6754ca
    int x_offset = datawin.min.x;
Packit Service 6754ca
    int y_offset = datawin.min.y;
Packit Service 6754ca
    const char * channel = file.header().channels().begin().name();
Packit Service 6754ca
    
Packit Service 6754ca
    vector<unsigned int> samplecounts(width);
Packit Service 6754ca
    vector<float *> sample_pointers(width);
Packit Service 6754ca
    vector<float> samples;
Packit Service 6754ca
    
Packit Service 6754ca
    DeepFrameBuffer fb;
Packit Service 6754ca
    
Packit Service 6754ca
    fb.insertSampleCountSlice(Slice(IMF::UINT,(char *) (&samplecounts[0]-x_offset) , sizeof(unsigned int)));
Packit Service 6754ca
    
Packit Service 6754ca
    fb.insert( channel,  DeepSlice(IMF::FLOAT,(char *) (&sample_pointers[0]-x_offset) , sizeof(float *),0,sizeof(float)) );
Packit Service 6754ca
    
Packit Service 6754ca
    file.setFrameBuffer(fb);
Packit Service 6754ca
    
Packit Service 6754ca
    for(int count=0;count<4000;count++)
Packit Service 6754ca
    {
Packit Service 6754ca
        int row = rand() % height + y_offset;
Packit Service 6754ca
        
Packit Service 6754ca
        //
Packit Service 6754ca
        // read row y (at random)
Packit Service 6754ca
        //
Packit Service 6754ca
        
Packit Service 6754ca
        file.readPixelSampleCounts(row,row);
Packit Service 6754ca
        //
Packit Service 6754ca
        // check that's correct, and also resize samples array
Packit Service 6754ca
        //
Packit Service 6754ca
        
Packit Service 6754ca
        int total_samples = 0;
Packit Service 6754ca
        for(int i=0;i
Packit Service 6754ca
        {
Packit Service 6754ca
            
Packit Service 6754ca
            if( samplecounts[i]!= row)
Packit Service 6754ca
            {
Packit Service 6754ca
              cout << i << ", " << row << " error, sample counts hould be "
Packit Service 6754ca
              << row  << ", is " << samplecounts[i]
Packit Service 6754ca
              << endl << flush;
Packit Service 6754ca
            }
Packit Service 6754ca
            
Packit Service 6754ca
            assert (samplecounts[i]== row);
Packit Service 6754ca
            
Packit Service 6754ca
            total_samples+=samplecounts[i];
Packit Service 6754ca
        }
Packit Service 6754ca
        
Packit Service 6754ca
        samples.resize(total_samples);
Packit Service 6754ca
        //
Packit Service 6754ca
        // set pointers to point to the correct place
Packit Service 6754ca
        //
Packit Service 6754ca
        int total=0;
Packit Service 6754ca
        for(int i=0 ; i
Packit Service 6754ca
        {
Packit Service 6754ca
            sample_pointers[i] = &samples[total];
Packit Service 6754ca
            total+=samplecounts[i];
Packit Service 6754ca
        }
Packit Service 6754ca
        
Packit Service 6754ca
        //
Packit Service 6754ca
        // read channel
Packit Service 6754ca
        //
Packit Service 6754ca
        
Packit Service 6754ca
        file.readPixels(row,row);
Packit Service 6754ca
        
Packit Service 6754ca
        //
Packit Service 6754ca
        // check
Packit Service 6754ca
        //
Packit Service 6754ca
        
Packit Service 6754ca
        for(int i=0;i
Packit Service 6754ca
        {
Packit Service 6754ca
           if(samples[i]!=row+100.f)
Packit Service 6754ca
           {
Packit Service 6754ca
               cout << " sample " << i << " on row " << row << " error, shuold be " 
Packit Service 6754ca
                    << 100.f+row << " got " << samples[i] << endl;
Packit Service 6754ca
               cout << flush;
Packit Service 6754ca
           }
Packit Service 6754ca
           assert(samples[i]==row+100.f);
Packit Service 6754ca
        }
Packit Service 6754ca
        
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
testDeepScanLineMultipleRead(const std::string & tempDir)
Packit Service 6754ca
{
Packit Service 6754ca
    
Packit Service 6754ca
    cout << "\n\nTesting random re-reads from deep scanline file:\n" << endl;
Packit Service 6754ca
    
Packit Service 6754ca
    std::string source_filename = tempDir + "imf_test_multiple_read";
Packit Service 6754ca
    srand(1);
Packit Service 6754ca
    
Packit Service 6754ca
    make_file(source_filename.c_str());
Packit Service 6754ca
    read_file(source_filename.c_str());
Packit Service 6754ca
    remove(source_filename.c_str());
Packit Service 6754ca
    
Packit Service 6754ca
    cout << " ok\n" << endl;
Packit Service 6754ca
    
Packit Service 6754ca
}