Blame IlmImfTest/testDeepScanLineMultipleRead.cpp

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