bool FileLoader::read()
{
auto block = MNNMemoryAllocAlign(gCacheSize, MNN_MEMORY_ALIGN_DEFAULT);
if (nullptr == block)
{
MNN_PRINT("Memory Alloc Failed\n");
return false;
}
auto size = fread(block, 1, gCacheSize, mFile);
mTotalSize = size;
mBlocks.push_back(std::make_pair(size, block));
while (size == gCacheSize)
{
block = MNNMemoryAllocAlign(gCacheSize, MNN_MEMORY_ALIGN_DEFAULT);
if (nullptr == block)
{
MNN_PRINT("Memory Alloc Failed\n");
return false;
}
size = fread(block, 1, gCacheSize, mFile);
if (size > gCacheSize)
{
MNN_PRINT("Read file Error\n");
MNNMemoryFreeAlign(block);
return false;
}
mTotalSize += size;
mBlocks.push_back(std::make_pair(size, block));
}
if (ferror(mFile))
{
return false;
}
return true;
}
FileLoader按块读取文件,将每块的大小及指针保存在mBlocks中。
bool FileLoader::merge(AutoStorage<uint8_t> &buffer)
{
buffer.reset((int)mTotalSize);
if (buffer.get() == nullptr)
{
MNN_PRINT("Memory Alloc Failed\n");
return false;
}
auto dst = buffer.get();
int offset = 0;
for (auto iter : mBlocks)
{
::memcpy(dst + offset, iter.second, iter.first);
offset += iter.first;
}
return true;
}
AutoStorage