HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ImfInputFile.h
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
4 // Digital Ltd. LLC
5 //
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
10 // met:
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 // * Neither the name of Industrial Light & Magic nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 ///////////////////////////////////////////////////////////////////////////
34 
35 
36 #ifndef INCLUDED_IMF_INPUT_FILE_H
37 #define INCLUDED_IMF_INPUT_FILE_H
38 
39 //-----------------------------------------------------------------------------
40 //
41 // class InputFile -- a scanline-based interface that can be used
42 // to read both scanline-based and tiled OpenEXR image files.
43 //
44 //-----------------------------------------------------------------------------
45 
46 #include "ImfHeader.h"
47 #include "ImfFrameBuffer.h"
48 #include "ImfTiledOutputFile.h"
49 #include "ImfThreading.h"
50 #include "ImfGenericInputFile.h"
51 #include "ImfNamespace.h"
52 #include "ImfForward.h"
53 #include "ImfExport.h"
54 
55 #include <fstream>
56 
57 
59 
60 
62 {
63  public:
64 
65  //-----------------------------------------------------------
66  // A constructor that opens the file with the specified name.
67  // Destroying the InputFile object will close the file.
68  //
69  // numThreads determines the number of threads that will be
70  // used to read the file (see ImfThreading.h).
71  //-----------------------------------------------------------
72 
74  InputFile (const char fileName[], int numThreads = globalThreadCount());
75 
76 
77  //-------------------------------------------------------------
78  // A constructor that attaches the new InputFile object to a
79  // file that has already been opened. Destroying the InputFile
80  // object will not close the file.
81  //
82  // numThreads determines the number of threads that will be
83  // used to read the file (see ImfThreading.h).
84  //-------------------------------------------------------------
85 
87  InputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads = globalThreadCount());
88 
89 
90  //-----------
91  // Destructor
92  //-----------
93 
95  virtual ~InputFile ();
96 
97 
98  //------------------------
99  // Access to the file name
100  //------------------------
101 
102  IMF_EXPORT
103  const char * fileName () const;
104 
105 
106  //--------------------------
107  // Access to the file header
108  //--------------------------
109 
110  IMF_EXPORT
111  const Header & header () const;
112 
113 
114  //----------------------------------
115  // Access to the file format version
116  //----------------------------------
117 
118  IMF_EXPORT
119  int version () const;
120 
121 
122  //-----------------------------------------------------------
123  // Set the current frame buffer -- copies the FrameBuffer
124  // object into the InputFile object.
125  //
126  // The current frame buffer is the destination for the pixel
127  // data read from the file. The current frame buffer must be
128  // set at least once before readPixels() is called.
129  // The current frame buffer can be changed after each call
130  // to readPixels().
131  //-----------------------------------------------------------
132 
133  IMF_EXPORT
134  void setFrameBuffer (const FrameBuffer &frameBuffer);
135 
136 
137  //-----------------------------------
138  // Access to the current frame buffer
139  //-----------------------------------
140 
141  IMF_EXPORT
142  const FrameBuffer & frameBuffer () const;
143 
144 
145  //---------------------------------------------------------------
146  // Check if the file is complete:
147  //
148  // isComplete() returns true if all pixels in the data window are
149  // present in the input file, or false if any pixels are missing.
150  // (Another program may still be busy writing the file, or file
151  // writing may have been aborted prematurely.)
152  //---------------------------------------------------------------
153 
154  IMF_EXPORT
155  bool isComplete () const;
156 
157 
158  //---------------------------------------------------------------
159  // Check if SSE optimization is enabled
160  //
161  // Call after setFrameBuffer() to query whether optimized file decoding
162  // is available - decode times will be faster if returns true
163  //
164  // Optimization depends on:
165  // the file type (only scanline data is supported),
166  // the framebuffer channels (RGB/RGBA mono or stereo)
167  // the framebuffer channel types (all channels half-float format only)
168  // the file channels (RGB/RGBA mono or stereo)
169  // the file channel types (all channel half-float format only)
170  // whether SSE2 instruction support was detected at compile time
171  //
172  // Calling isOptimizationEnabled before setFrameBuffer will throw an exception
173  //
174  //---------------------------------------------------------------
175 
176  IMF_EXPORT
177  bool isOptimizationEnabled () const;
178 
179 
180 
181 
182  //---------------------------------------------------------------
183  // Read pixel data:
184  //
185  // readPixels(s1,s2) reads all scan lines with y coordinates
186  // in the interval [min (s1, s2), max (s1, s2)] from the file,
187  // and stores them in the current frame buffer.
188  //
189  // Both s1 and s2 must be within the interval
190  // [header().dataWindow().min.y, header().dataWindow().max.y]
191  //
192  // The scan lines can be read from the file in random order, and
193  // individual scan lines may be skipped or read multiple times.
194  // For maximum efficiency, the scan lines should be read in the
195  // order in which they were written to the file.
196  //
197  // readPixels(s) calls readPixels(s,s).
198  //
199  //---------------------------------------------------------------
200 
201  IMF_EXPORT
202  void readPixels (int scanLine1, int scanLine2);
203  IMF_EXPORT
204  void readPixels (int scanLine);
205 
206 
207  //----------------------------------------------
208  // Read a block of raw pixel data from the file,
209  // without uncompressing it (this function is
210  // used to implement OutputFile::copyPixels()).
211  //----------------------------------------------
212 
213  IMF_EXPORT
214  void rawPixelData (int firstScanLine,
215  const char *&pixelData,
216  int &pixelDataSize);
217 
218 
219  //----------------------------------------------
220  // Read a scanline's worth of raw pixel data
221  // from the file, without uncompressing it, and
222  // store in an external buffer, pixelData.
223  // pixelData should be pre-allocated with space
224  // for pixelDataSize chars.
225  //
226  // This function can be used to separate the
227  // reading of a raw scan line from the
228  // decompression of that scan line, for
229  // example to allow multiple scan lines to be
230  // decompressed in parallel by an application's
231  // own threads, where it is not convenient to
232  // use the threading within the library.
233  //----------------------------------------------
234 
235  IMF_EXPORT
236  void rawPixelDataToBuffer (int scanLine,
237  char *pixelData,
238  int &pixelDataSize) const;
239 
240 
241 
242  //--------------------------------------------------
243  // Read a tile of raw pixel data from the file,
244  // without uncompressing it (this function is
245  // used to implement TiledOutputFile::copyPixels()).
246  //--------------------------------------------------
247 
248  IMF_EXPORT
249  void rawTileData (int &dx, int &dy,
250  int &lx, int &ly,
251  const char *&pixelData,
252  int &pixelDataSize);
253 
254  struct Data;
255 
256  private:
257 
258  InputFile (InputPartData* part);
259  InputFile (const InputFile &); // not implemented
260  InputFile & operator = (const InputFile &); // not implemented
261 
262  void initialize ();
263  void multiPartInitialize(InputPartData* part);
264  void compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is);
265  TiledInputFile * tFile ();
266 
267  friend void TiledOutputFile::copyPixels (InputFile &);
268 
269  Data * _data;
270 
271 
272  friend class MultiPartInputFile;
273 };
274 
275 
277 
278 #endif
#define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
Definition: ImfNamespace.h:109
IMF_EXPORT const char * fileName() const
IMF_EXPORT void copyPixels(TiledInputFile &in)
IMF_EXPORT void readPixels(int scanLine1, int scanLine2)
IMF_EXPORT bool isComplete() const
IMF_EXPORT InputFile(const char fileName[], int numThreads=globalThreadCount())
IMF_EXPORT const FrameBuffer & frameBuffer() const
IMF_EXPORT void rawTileData(int &dx, int &dy, int &lx, int &ly, const char *&pixelData, int &pixelDataSize)
IMF_EXPORT bool isOptimizationEnabled() const
IMF_EXPORT void rawPixelData(int firstScanLine, const char *&pixelData, int &pixelDataSize)
virtual IMF_EXPORT ~InputFile()
IMF_EXPORT int version() const
#define IMF_EXPORT
Definition: ImfExport.h:44
OPENVDB_API void initialize()
Global registration of basic types.
Definition: logging.h:294
IMF_EXPORT const Header & header() const
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER IMF_EXPORT int globalThreadCount()
#define OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
Definition: ImfNamespace.h:108
IMF_EXPORT void setFrameBuffer(const FrameBuffer &frameBuffer)
IMF_EXPORT void rawPixelDataToBuffer(int scanLine, char *pixelData, int &pixelDataSize) const