added in logic for parsing through blocks/frames
This commit is contained in:
+79
-10
@@ -870,6 +870,8 @@ typedef struct {
|
|||||||
int usesCheck;
|
int usesCheck;
|
||||||
} fileInfo_t;
|
} fileInfo_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reads information from file, stores in *info
|
* Reads information from file, stores in *info
|
||||||
* if successful, returns 0, otherwise returns 1
|
* if successful, returns 0, otherwise returns 1
|
||||||
@@ -880,26 +882,93 @@ int getFileInfo(fileInfo_t* info, const char* inFileName){
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
info->compressedSize = UTIL_getFileSize(inFileName);
|
info->compressedSize = UTIL_getFileSize(inFileName);
|
||||||
BYTE* frameHeaderBuffer = malloc(ZSTD_frameHeaderSize_max);
|
|
||||||
fread(frameHeaderBuffer, ZSTD_frameHeaderSize_max, 1, srcFile);
|
|
||||||
info->decompressedSize = 0;
|
info->decompressedSize = 0;
|
||||||
info->numActualFrames = 0;
|
info->numActualFrames = 0;
|
||||||
info-> numSkippableFrames = 0;
|
info-> numSkippableFrames = 0;
|
||||||
|
|
||||||
/* begin analyzing frame */
|
/* begin analyzing frame */
|
||||||
|
while(1){
|
||||||
info->decompressedSize += ZSTD_getFrameContentSize((void*)frameHeaderBuffer, ZSTD_FRAMEHEADERSIZE_MAX);
|
BYTE magicNumberBuffer[4];
|
||||||
U32 magicNumber = frameHeaderBuffer[0] + (frameHeaderBuffer[1] << 8) + (frameHeaderBuffer[2] << 16) + (frameHeaderBuffer[3] << 24);
|
int numBytesRead = fread(magicNumberBuffer, 1, 4, srcFile);
|
||||||
|
if(numBytesRead != 4) break;
|
||||||
|
U32 magicNumber = MEM_readLE32(magicNumberBuffer);
|
||||||
if(magicNumber==ZSTD_MAGICNUMBER){
|
if(magicNumber==ZSTD_MAGICNUMBER){
|
||||||
|
DISPLAY("Hello\n");
|
||||||
|
int frameContentSizeBytes=0;
|
||||||
info->numActualFrames++;
|
info->numActualFrames++;
|
||||||
|
BYTE frameHeaderDescriptor;
|
||||||
|
fread(&frameHeaderDescriptor, 1, 1, srcFile);
|
||||||
|
|
||||||
|
/* calculate actual frame header size */
|
||||||
|
int frameContentSizeFlag = frameHeaderDescriptor >> 6;
|
||||||
|
int singleSegmentFlag = (frameHeaderDescriptor & (1 << 5)) >> 5;
|
||||||
|
int contentChecksumFlag = (frameHeaderDescriptor & (1 << 2)) >> 2;
|
||||||
|
int dictionaryIDFlag = frameHeaderDescriptor & 3;
|
||||||
|
if(frameContentSizeFlag!=0){
|
||||||
|
frameContentSizeBytes = 1 << frameContentSizeFlag;
|
||||||
|
}
|
||||||
|
else if(singleSegmentFlag){
|
||||||
|
frameContentSizeBytes = 1;
|
||||||
|
}
|
||||||
|
int windowDescriptorBytes = singleSegmentFlag ? 0 : 1;
|
||||||
|
int dictionaryIDBytes = dictionaryIDFlag ? 1 << (dictionaryIDFlag - 1): 0;
|
||||||
|
int totalFrameHeaderBytes = 4 + 1 + windowDescriptorBytes + frameContentSizeBytes + dictionaryIDBytes;
|
||||||
|
|
||||||
|
/* reset to beginning of from and read entire header */
|
||||||
|
fseek(srcFile, -5, SEEK_CUR);
|
||||||
|
BYTE* frameHeader = malloc(totalFrameHeaderBytes);
|
||||||
|
fread(frameHeader, totalFrameHeaderBytes, 1, srcFile);
|
||||||
|
|
||||||
|
/* get decompressed file size */
|
||||||
|
info->decompressedSize = ZSTD_getFrameContentSize(frameHeader, totalFrameHeaderBytes);
|
||||||
|
|
||||||
|
/* check if checksum is used */
|
||||||
|
if(contentChecksumFlag){
|
||||||
|
info->usesCheck = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* skip the rest of the blocks in the frame */
|
||||||
|
int lastBlock = 0;
|
||||||
|
do{
|
||||||
|
BYTE blockHeaderBuffer[3];
|
||||||
|
fread(blockHeaderBuffer, 3, 1, srcFile);
|
||||||
|
U32 blockHeader = MEM_readLE24(blockHeaderBuffer);
|
||||||
|
lastBlock = blockHeader & 1;
|
||||||
|
int blockSize = (blockHeader - (blockHeader & 7)) >> 3;
|
||||||
|
fseek(srcFile, blockSize, SEEK_CUR);
|
||||||
|
}while(lastBlock != 1);
|
||||||
|
if(contentChecksumFlag){
|
||||||
|
fseek(srcFile, 4, SEEK_CUR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(magicNumber==ZSTD_MAGIC_SKIPPABLE_START){
|
else if(magicNumber==ZSTD_MAGIC_SKIPPABLE_START){
|
||||||
info->numSkippableFrames++;
|
info->numSkippableFrames++;
|
||||||
|
BYTE frameSizeBuffer[4];
|
||||||
|
fread(frameSizeBuffer, 4, 1, srcFile);
|
||||||
|
long frameSize = MEM_readLE32(frameSizeBuffer);
|
||||||
|
fseek(srcFile, frameSize, SEEK_CUR);
|
||||||
}
|
}
|
||||||
const int checksumBitMask = 4;
|
|
||||||
if(frameHeaderBuffer[1] & checksumBitMask){
|
|
||||||
DISPLAY("Uses checksum\n");
|
// int isSkippableFrame = 0;
|
||||||
info->usesCheck = 1;
|
// /* analyze the first 18 bytes (magic number + frame header) of the frame */
|
||||||
|
// BYTE* frameHeaderBuffer = malloc(ZSTD_frameHeaderSize_max);
|
||||||
|
// fread(frameHeaderBuffer, ZSTD_frameHeaderSize_max, 1, srcFile);
|
||||||
|
// info->decompressedSize += ZSTD_getFrameContentSize((void*)frameHeaderBuffer, ZSTD_FRAMEHEADERSIZE_MAX);
|
||||||
|
// U32 magicNumber = frameHeaderBuffer[0] + (frameHeaderBuffer[1] << 8) + (frameHeaderBuffer[2] << 16) + (frameHeaderBuffer[3] << 24);
|
||||||
|
// if(magicNumber==ZSTD_MAGICNUMBER){
|
||||||
|
// info->numActualFrames++;
|
||||||
|
// }
|
||||||
|
// else if(magicNumber==ZSTD_MAGIC_SKIPPABLE_START){
|
||||||
|
// info->numSkippableFrames++;
|
||||||
|
// isSkippableFrame = 1;
|
||||||
|
// }
|
||||||
|
// const int checksumBitMask = 4;
|
||||||
|
// if(frameHeaderBuffer[1] & checksumBitMask){
|
||||||
|
// DISPLAY("Uses checksum\n");
|
||||||
|
// info->usesCheck = 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user