dng_stream.h revision 8e8939fc10ad63576a2785ba1333a23726b7e164
18e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 28e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Copyright 2006-2007 Adobe Systems Incorporated 38e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// All Rights Reserved. 48e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// 58e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// NOTICE: Adobe permits you to use, modify, and distribute this file in 68e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it. 78e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 88e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 98e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_stream.h#2 $ */ 108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $DateTime: 2012/06/01 07:28:57 $ */ 118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Change: 832715 $ */ 128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Author: tknoll $ */ 138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/** Data stream abstraction for serializing and deserializing sequences of 158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener * basic types and RAW image data. 168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener */ 178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#ifndef __dng_stream__ 218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#define __dng_stream__ 228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_classes.h" 268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_types.h" 278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_memory.h" 288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_rational.h" 298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_utils.h" 308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Constants for invalid offset in streams. 348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 358e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerconst uint64 kDNGStreamInvalidOffset = (uint64) (int64) -1; 368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/// Base stream abstraction. Has support for going between stream and pointer 408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/// abstraction. 418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 428e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass dng_stream 438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener public: 468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener enum 488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener kSmallBufferSize = 4 * 1024, 518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener kBigBufferSize = 64 * 1024, 528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener kDefaultBufferSize = kSmallBufferSize 548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener }; 568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener private: 588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool fSwapBytes; 608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool fHaveLength; 628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 fLength; 648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const uint64 fOffsetInOriginalFile; 668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 fPosition; 688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_memory_data fMemBlock; 708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint8 *fBuffer; 728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 fBufferSize; 748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 fBufferStart; 768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 fBufferEnd; 778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 fBufferLimit; 788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool fBufferDirty; 808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_abort_sniffer *fSniffer; 828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener protected: 848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_stream (dng_abort_sniffer *sniffer = NULL, 868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 bufferSize = kDefaultBufferSize, 878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 offsetInOriginalFile = kDNGStreamInvalidOffset); 888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual uint64 DoGetLength (); 908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual void DoRead (void *data, 928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 count, 938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 offset); 948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual void DoSetLength (uint64 length); 968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual void DoWrite (const void *data, 988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 count, 998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 offset); 1008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener public: 1028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Construct a stream with initial data. 1048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param data Pointer to initial contents of stream. 1058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param count Number of bytes data is valid for. 1068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param offsetInOriginalFile If data came from a file originally, 1078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// offset can be saved here for later use. 1088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_stream (const void *data, 1108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 count, 1118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 offsetInOriginalFile = kDNGStreamInvalidOffset); 1128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual ~dng_stream (); 1148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for whether stream is swapping byte order on input/output. 1168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval If true, data will be swapped on input/output. 1178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool SwapBytes () const 1198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return fSwapBytes; 1218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Setter for whether stream is swapping byte order on input/output. 1248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param swapBytes If true, stream will swap byte order on input or 1258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// output for future reads/writes. 1268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void SetSwapBytes (bool swapBytes) 1288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fSwapBytes = swapBytes; 1308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for whether data in stream is big endian. 1338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval If true, data in stream is big endian. 1348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool BigEndian () const; 1368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Setter for whether data in stream is big endian. 1388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param bigEndian If true, data in stream is big endian. 1398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void SetBigEndian (bool bigEndian = true); 1418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for whether data in stream is big endian. 1438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval If true, data in stream is big endian. 1448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool LittleEndian () const 1468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return !BigEndian (); 1488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Setter for whether data in stream is big endian. 1518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param littleEndian If true, data in stream is big endian. 1528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void SetLittleEndian (bool littleEndian = true) 1548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener SetBigEndian (!littleEndian); 1568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Returns the size of the buffer used by the stream. 1598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 BufferSize () const 1618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return fBufferSize; 1638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for length of data in stream. 1668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval Length of readable data in stream. 1678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 Length () 1698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (!fHaveLength) 1728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fLength = DoGetLength (); 1758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fHaveLength = true; 1778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return fLength; 1818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for current offset in stream. 1858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval current offset from start of stream. 1868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 Position () const 1888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 1898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return fPosition; 1908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 1918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for current position in original file, taking into account 1938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// OffsetInOriginalFile stream data was taken from. 1948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval kInvalidOffset if no offset in original file is set, sum 1958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// of offset in original file and current position otherwise. 1968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 PositionInOriginalFile () const; 1988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 1998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for offset in original file. 2008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval kInvalidOffset if no offset in original file is set, 2018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// offset in original file otherwise. 2028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 OffsetInOriginalFile () const; 2048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Return pointer to stream contents if the stream is entirely 2068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// available as a single memory block, NULL otherwise. 2078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener const void * Data () const; 2098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Return the entire stream as a single memory block. 2118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// This works for all streams, but requires copying the data to a new buffer. 2128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param allocator Allocator used to allocate memory. 2138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_memory_block * AsMemoryBlock (dng_memory_allocator &allocator); 2158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Seek to a new position in stream for reading. 2178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void SetReadPosition (uint64 offset); 2198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Skip forward in stream. 2218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param delta Number of bytes to skip forward. 2228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Skip (uint64 delta) 2248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener SetReadPosition (Position () + delta); 2268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get data from stream. Exception is thrown and no data is read if 2298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// insufficient data available in stream. 2308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param data Buffer to put data into. Must be valid for count bytes. 2318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param count Bytes of data to read. 2328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 2338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 2348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Get (void *data, uint32 count); 2368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Seek to a new position in stream for writing. 2388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void SetWritePosition (uint64 offset); 2408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Force any stored data in stream to be written to underlying storage. 2428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Flush (); 2448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Set length of available data. 2468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param length Number of bytes of avialble data in stream. 2478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void SetLength (uint64 length); 2498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Write data to stream. 2518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param data Buffer of data to write to stream. 2528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param count Bytes of in data. 2538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put (const void *data, uint32 count); 2558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get an unsigned 8-bit integer from stream and advance read position. 2578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One unsigned 8-bit integer. 2588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 2598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 2608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint8 Get_uint8 () 2628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Fast check to see if in buffer 2658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (fPosition >= fBufferStart && fPosition < fBufferEnd) 2678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return fBuffer [fPosition++ - fBufferStart]; 2708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Not in buffer, let main routine do the work. 2748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint8 x; 2768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Get (&x, 1); 2788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return x; 2808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 2828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put an unsigned 8-bit integer to stream and advance write position. 2848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One unsigned 8-bit integer. 2858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_uint8 (uint8 x) 2878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (fBufferDirty && 2908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fPosition >= fBufferStart && 2918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fPosition <= fBufferEnd && 2928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fPosition < fBufferLimit) 2938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 2948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fBuffer [fPosition - fBufferStart] = x; 2968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fPosition++; 2988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 2998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener if (fBufferEnd < fPosition) 3008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fBufferEnd = fPosition; 3018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fLength = Max_uint64 (Length (), fPosition); 3038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener else 3078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Put (&x, 1); 3108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get an unsigned 16-bit integer from stream and advance read position. 3168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One unsigned 16-bit integer. 3188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 3198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 3208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint16 Get_uint16 (); 3228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put an unsigned 16-bit integer to stream and advance write position. 3248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One unsigned 16-bit integer. 3268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_uint16 (uint16 x); 3288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get an unsigned 32-bit integer from stream and advance read position. 3308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One unsigned 32-bit integer. 3328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 3338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 3348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 Get_uint32 (); 3368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put an unsigned 32-bit integer to stream and advance write position. 3388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One unsigned 32-bit integer. 3408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_uint32 (uint32 x); 3428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get an unsigned 64-bit integer from stream and advance read position. 3448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One unsigned 64-bit integer. 3468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 3478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 3488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 Get_uint64 (); 3508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put an unsigned 64-bit integer to stream and advance write position. 3528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One unsigned 64-bit integer. 3548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_uint64 (uint64 x); 3568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get one 8-bit integer from stream and advance read position. 3588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 8-bit integer. 3598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 3608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 3618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener int8 Get_int8 () 3638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return (int8) Get_uint8 (); 3658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put one 8-bit integer to stream and advance write position. 3688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One 8-bit integer. 3698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_int8 (int8 x) 3718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Put_uint8 ((uint8) x); 3738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get one 16-bit integer from stream and advance read position. 3768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 16-bit integer. 3788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 3798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 3808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener int16 Get_int16 () 3828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return (int16) Get_uint16 (); 3848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put one 16-bit integer to stream and advance write position. 3878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One 16-bit integer. 3898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_int16 (int16 x) 3918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 3928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Put_uint16 ((uint16) x); 3938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 3948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 3958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get one 32-bit integer from stream and advance read position. 3968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 3978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 32-bit integer. 3988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 3998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 4008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener int32 Get_int32 () 4028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return (int32) Get_uint32 (); 4048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put one 32-bit integer to stream and advance write position. 4078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 4088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One 32-bit integer. 4098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_int32 (int32 x) 4118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Put_uint32 ((uint32) x); 4138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get one 64-bit integer from stream and advance read position. 4168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 4178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 64-bit integer. 4188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 4198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 4208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener int64 Get_int64 () 4228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return (int64) Get_uint64 (); 4248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put one 64-bit integer to stream and advance write position. 4278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Byte swap if byte swapping is turned on. 4288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One 64-bit integer. 4298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_int64 (int64 x) 4318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 4328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener Put_uint64 ((uint64) x); 4338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 4348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get one 32-bit IEEE floating-point number from stream and advance 4368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// read position. Byte swap if byte swapping is turned on. 4378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 32-bit IEEE floating-point number. 4388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 4398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 4408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real32 Get_real32 (); 4428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put one 32-bit IEEE floating-point number to stream and advance write 4448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// position. Byte swap if byte swapping is turned on. 4458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One 32-bit IEEE floating-point number. 4468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_real32 (real32 x); 4488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get one 64-bit IEEE floating-point number from stream and advance 4508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// read position. Byte swap if byte swapping is turned on. 4518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 64-bit IEEE floating-point number . 4528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 4538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 4548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 Get_real64 (); 4568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Put one 64-bit IEEE floating-point number to stream and advance write 4588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// position. Byte swap if byte swapping is turned on. 4598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param x One64-bit IEEE floating-point number. 4608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Put_real64 (real64 x); 4628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get an 8-bit character string from stream and advance read position. 4648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Routine always reads until a NUL character (8-bits of zero) is read. 4658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// (That is, only maxLength bytes will be returned in buffer, but the 4668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// stream is always advanced until a NUL is read or EOF is reached.) 4678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param data Buffer in which string is returned. 4688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param maxLength Maximum number of bytes to place in buffer. 4698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 4708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if stream runs out before NUL is seen. 4718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Get_CString (char *data, 4738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 maxLength); 4748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get a 16-bit character string from stream and advance read position. 4768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// 16-bit characters are truncated to 8-bits. 4778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Routine always reads until a NUL character (16-bits of zero) is read. 4788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// (That is, only maxLength bytes will be returned in buffer, but the 4798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// stream is always advanced until a NUL is read or EOF is reached.) 4808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param data Buffer to place string in. 4818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param maxLength Maximum number of bytes to place in buffer. 4828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 4838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if stream runs out before NUL is seen. 4848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void Get_UString (char *data, 4868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 maxLength); 4878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Writes the specified number of zero bytes to stream. 4898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param count Number of zero bytes to write. 4908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void PutZeros (uint64 count); 4928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Writes zeros to align the stream position to a multiple of 2. 4948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void PadAlign2 (); 4968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Writes zeros to align the stream position to a multiple of 4. 4988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 4998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void PadAlign4 (); 5008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get a value of size indicated by tag type from stream and advance 5028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// read position. Byte swap if byte swapping is turned on and tag type 5038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// is larger than a byte. Value is returned as an unsigned 32-bit integer. 5048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param tagType Tag type of data stored in stream. 5058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One unsigned 32-bit integer. 5068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 5078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 5088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint32 TagValue_uint32 (uint32 tagType); 5108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get a value of size indicated by tag type from stream and advance read 5128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// position. Byte swap if byte swapping is turned on and tag type is larger 5138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// than a byte. Value is returned as a 32-bit integer. 5148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param tagType Tag type of data stored in stream. 5158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 32-bit integer. 5168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 5178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 5188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener int32 TagValue_int32 (uint32 tagType); 5208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get a value of size indicated by tag type from stream and advance read 5228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// position. Byte swap if byte swapping is turned on and tag type is larger 5238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// than a byte. Value is returned as a dng_urational. 5248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param tagType Tag type of data stored in stream. 5258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One dng_urational. 5268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 5278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 5288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_urational TagValue_urational (uint32 tagType); 5308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get a value of size indicated by tag type from stream and advance read 5328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// position. Byte swap if byte swapping is turned on and tag type is larger 5338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// than a byte. Value is returned as a dng_srational. 5348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param tagType Tag type of data stored in stream. 5358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One dng_srational. 5368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 5378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 5388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_srational TagValue_srational (uint32 tagType); 5408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Get a value of size indicated by tag type from stream and advance read 5428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// position. Byte swap if byte swapping is turned on and tag type is larger 5438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// than a byte. Value is returned as a 64-bit IEEE floating-point number. 5448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param tagType Tag type of data stored in stream. 5458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval One 64-bit IEEE floating-point number. 5468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \exception dng_exception with fErrorCode equal to dng_error_end_of_file 5478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// if not enough data in stream. 5488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener real64 TagValue_real64 (uint32 tagType); 5508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Getter for sniffer associated with stream. 5528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \retval The sniffer for this stream. 5538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_abort_sniffer * Sniffer () const 5558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener return fSniffer; 5578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Putter for sniffer associated with stream. 5608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param sniffer The new sniffer to use (or NULL for none). 5618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void SetSniffer (dng_abort_sniffer *sniffer) 5638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fSniffer = sniffer; 5658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 5668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Copy a specified number of bytes to a target stream. 5688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param dstStream The target stream. 5698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param count The number of bytes to copy. 5708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual void CopyToStream (dng_stream &dstStream, 5728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 count); 5738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// Makes the target stream a copy of this stream. 5758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener /// \param dstStream The target stream. 5768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener void DuplicateStream (dng_stream &dstStream); 5788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener private: 5808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Hidden copy constructor and assignment operator. 5828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_stream (const dng_stream &stream); 5848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_stream & operator= (const dng_stream &stream); 5868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener }; 5888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 5908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5918e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass TempBigEndian 5928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 5938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener private: 5958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_stream & fStream; 5978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 5988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool fOldSwap; 5998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener public: 6018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener TempBigEndian (dng_stream &stream, 6038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool bigEndian = true); 6048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual ~TempBigEndian (); 6068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener }; 6088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 6108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6118e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass TempLittleEndian: public TempBigEndian 6128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener public: 6158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener TempLittleEndian (dng_stream &stream, 6178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener bool littleEndian = true) 6188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : TempBigEndian (stream, !littleEndian) 6208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual ~TempLittleEndian () 6258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener }; 6298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 6318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6328e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass TempStreamSniffer 6338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener private: 6368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_stream & fStream; 6388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_abort_sniffer *fOldSniffer; 6408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener public: 6428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener TempStreamSniffer (dng_stream &stream, 6448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_abort_sniffer *sniffer); 6458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener virtual ~TempStreamSniffer (); 6478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener private: 6498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Hidden copy constructor and assignment operator. 6518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener TempStreamSniffer (const TempStreamSniffer &temp); 6538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener TempStreamSniffer & operator= (const TempStreamSniffer &temp); 6558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener }; 6578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 6598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6608e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass PreserveStreamReadPosition 6618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener private: 6648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener dng_stream & fStream; 6668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener uint64 fPosition; 6688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener public: 6708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener PreserveStreamReadPosition (dng_stream &stream) 6728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener : fStream (stream) 6748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener , fPosition (stream.Position ()) 6758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener ~PreserveStreamReadPosition () 6808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener { 6818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener fStream.SetReadPosition (fPosition); 6828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener } 6838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener private: 6858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener // Hidden copy constructor and assignment operator. 6878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener PreserveStreamReadPosition (const PreserveStreamReadPosition &rhs); 6898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener PreserveStreamReadPosition & operator= (const PreserveStreamReadPosition &rhs); 6918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener }; 6938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 6958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#endif 6978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener 6988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/ 699