/*! If frame or line mapping is used the parameter Count is used to * determine how many items are read. In frame wrapping it is in * units of EditRate, as specified in the call to Use(), which may * not be the frame rate of this essence stream * \note This is the only safe option for clip wrapping * \return Count of bytes transferred */ Length mxflib::WAVE_PCM_EssenceSubParser::Write(FileHandle InFile, UInt32 Stream, MXFFilePtr OutFile, UInt64 Count /*=1*/ /*, IndexTablePtr Index*/ /*=NULL*/) { const unsigned int BUFFERSIZE = 32768; UInt8 *Buffer = new UInt8[BUFFERSIZE]; // Move to the current position if(BytePosition == 0) BytePosition = DataStart; FileSeek(InFile, BytePosition); // Scan the stream and find out how many bytes to transfer // Either use the cached value, or scan the stream and find out how many bytes to read if((CachedDataSize == static_cast<size_t>(-1)) || (CachedCount != Count)) ReadInternal(InFile, Stream, Count); size_t Bytes = CachedDataSize; Length Ret = static_cast<Length>(Bytes); // Clear the cached size CachedDataSize = static_cast<size_t>(-1); while(Bytes) { size_t ChunkSize; // Number of bytes to transfer in this chunk if(Bytes < BUFFERSIZE) ChunkSize = Bytes; else ChunkSize = BUFFERSIZE; FileRead(InFile, Buffer, ChunkSize); OutFile->Write(Buffer, ChunkSize); Bytes -= ChunkSize; } // Update the file pointer BytePosition = FileTell(InFile); // Free the buffer delete[] Buffer; return Ret; }