mirror of
https://github.com/facebook/zstd.git
synced 2025-07-30 22:23:13 +03:00
s/chunk/frame/
This commit is contained in:
@ -29,11 +29,11 @@ typedef struct {
|
||||
int checksumFlag;
|
||||
} seekTable_t;
|
||||
|
||||
/** ZSTD_seekable_offsetToChunk() :
|
||||
* Performs a binary search to find the last chunk with a decompressed offset
|
||||
/** ZSTD_seekable_offsetToFrame() :
|
||||
* Performs a binary search to find the last frame with a decompressed offset
|
||||
* <= pos
|
||||
* @return : the chunk's index */
|
||||
static U32 ZSTD_seekable_offsetToChunk(const seekTable_t* table, U64 pos)
|
||||
* @return : the frame's index */
|
||||
static U32 ZSTD_seekable_offsetToFrame(const seekTable_t* table, U64 pos)
|
||||
{
|
||||
U32 lo = 0;
|
||||
U32 hi = table->tableLen;
|
||||
@ -61,7 +61,7 @@ struct ZSTD_seekable_DStream_s {
|
||||
ZSTD_DStream* dstream;
|
||||
seekTable_t seekTable;
|
||||
|
||||
U32 curChunk;
|
||||
U32 curFrame;
|
||||
U64 compressedOffset;
|
||||
U64 decompressedOffset;
|
||||
|
||||
@ -107,7 +107,7 @@ size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src,
|
||||
{
|
||||
const BYTE* ip = (const BYTE*)src + srcSize;
|
||||
|
||||
U32 numChunks;
|
||||
U32 numFrames;
|
||||
int checksumFlag;
|
||||
|
||||
U32 sizePerEntry;
|
||||
@ -129,10 +129,10 @@ size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src,
|
||||
}
|
||||
}
|
||||
|
||||
numChunks = MEM_readLE32(ip-9);
|
||||
numFrames = MEM_readLE32(ip-9);
|
||||
sizePerEntry = 8 + (checksumFlag?4:0);
|
||||
|
||||
{ U32 const tableSize = sizePerEntry * numChunks;
|
||||
{ U32 const tableSize = sizePerEntry * numFrames;
|
||||
U32 const frameSize = tableSize + ZSTD_seekTableFooterSize + ZSTD_skippableHeaderSize;
|
||||
|
||||
const BYTE* base = ip - frameSize;
|
||||
@ -148,7 +148,7 @@ size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src,
|
||||
|
||||
{ /* Allocate an extra entry at the end so that we can do size
|
||||
* computations on the last element without special case */
|
||||
seekEntry_t* entries = malloc(sizeof(seekEntry_t) * (numChunks + 1));
|
||||
seekEntry_t* entries = malloc(sizeof(seekEntry_t) * (numFrames + 1));
|
||||
const BYTE* tableBase = base + ZSTD_skippableHeaderSize;
|
||||
|
||||
U32 idx;
|
||||
@ -163,7 +163,7 @@ size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src,
|
||||
}
|
||||
|
||||
/* compute cumulative positions */
|
||||
for (idx = 0, pos = 0; idx < numChunks; idx++) {
|
||||
for (idx = 0, pos = 0; idx < numFrames; idx++) {
|
||||
entries[idx].cOffset = cOffset;
|
||||
entries[idx].dOffset = dOffset;
|
||||
|
||||
@ -174,11 +174,11 @@ size_t ZSTD_seekable_loadSeekTable(ZSTD_seekable_DStream* zds, const void* src,
|
||||
pos += 4;
|
||||
}
|
||||
}
|
||||
entries[numChunks].cOffset = cOffset;
|
||||
entries[numChunks].dOffset = dOffset;
|
||||
entries[numFrames].cOffset = cOffset;
|
||||
entries[numFrames].dOffset = dOffset;
|
||||
|
||||
zds->seekTable.entries = entries;
|
||||
zds->seekTable.tableLen = numChunks;
|
||||
zds->seekTable.tableLen = numFrames;
|
||||
zds->seekTable.checksumFlag = checksumFlag;
|
||||
return 0;
|
||||
}
|
||||
@ -197,7 +197,7 @@ size_t ZSTD_seekable_initDStream(ZSTD_seekable_DStream* zds, U64 rangeStart, U64
|
||||
zds->stage = zsds_seek;
|
||||
|
||||
/* force a seek first */
|
||||
zds->curChunk = (U32) -1;
|
||||
zds->curFrame = (U32) -1;
|
||||
zds->compressedOffset = (U64) -1;
|
||||
zds->decompressedOffset = (U64) -1;
|
||||
|
||||
@ -271,7 +271,7 @@ size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer
|
||||
/* need more input */
|
||||
return MIN(
|
||||
ZSTD_DStreamInSize(),
|
||||
(size_t)(jt->entries[zds->curChunk + 1]
|
||||
(size_t)(jt->entries[zds->curFrame + 1]
|
||||
.cOffset -
|
||||
zds->compressedOffset));
|
||||
}
|
||||
@ -281,7 +281,7 @@ size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer
|
||||
{
|
||||
U64 const toDecompress =
|
||||
MIN(zds->targetEnd,
|
||||
jt->entries[zds->curChunk + 1].dOffset) -
|
||||
jt->entries[zds->curFrame + 1].dOffset) -
|
||||
zds->decompressedOffset;
|
||||
size_t const prevInputPos = input->pos;
|
||||
|
||||
@ -305,7 +305,7 @@ size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer
|
||||
if (ret == 0) {
|
||||
/* verify the checksum */
|
||||
U32 const digest = XXH64_digest(&zds->xxhState) & 0xFFFFFFFFU;
|
||||
if (digest != jt->entries[zds->curChunk].checksum) {
|
||||
if (digest != jt->entries[zds->curFrame].checksum) {
|
||||
return ERROR(checksum_wrong);
|
||||
}
|
||||
|
||||
@ -323,9 +323,9 @@ size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer
|
||||
/* frame is done */
|
||||
/* make sure this lines up with the expected frame border */
|
||||
if (zds->decompressedOffset !=
|
||||
jt->entries[zds->curChunk + 1].dOffset ||
|
||||
jt->entries[zds->curFrame + 1].dOffset ||
|
||||
zds->compressedOffset !=
|
||||
jt->entries[zds->curChunk + 1].cOffset)
|
||||
jt->entries[zds->curFrame + 1].cOffset)
|
||||
return ERROR(corruption_detected);
|
||||
ZSTD_resetDStream(zds->dstream);
|
||||
zds->stage = zsds_seek;
|
||||
@ -334,29 +334,29 @@ size_t ZSTD_seekable_decompressStream(ZSTD_seekable_DStream* zds, ZSTD_outBuffer
|
||||
|
||||
/* need more input */
|
||||
return MIN(ZSTD_DStreamInSize(), (size_t)(
|
||||
jt->entries[zds->curChunk + 1].cOffset -
|
||||
jt->entries[zds->curFrame + 1].cOffset -
|
||||
zds->compressedOffset));
|
||||
}
|
||||
}
|
||||
case zsds_seek: {
|
||||
U32 targetChunk;
|
||||
U32 targetFrame;
|
||||
if (zds->decompressedOffset < zds->targetStart ||
|
||||
zds->decompressedOffset >= zds->targetEnd) {
|
||||
/* haven't started yet */
|
||||
targetChunk = ZSTD_seekable_offsetToChunk(jt, zds->targetStart);
|
||||
targetFrame = ZSTD_seekable_offsetToFrame(jt, zds->targetStart);
|
||||
} else {
|
||||
targetChunk = ZSTD_seekable_offsetToChunk(jt, zds->decompressedOffset);
|
||||
targetFrame = ZSTD_seekable_offsetToFrame(jt, zds->decompressedOffset);
|
||||
}
|
||||
|
||||
zds->curChunk = targetChunk;
|
||||
zds->curFrame = targetFrame;
|
||||
|
||||
if (zds->compressedOffset == jt->entries[targetChunk].cOffset) {
|
||||
if (zds->compressedOffset == jt->entries[targetFrame].cOffset) {
|
||||
zds->stage = zsds_decompress;
|
||||
break;
|
||||
}
|
||||
|
||||
zds->nextSeek = jt->entries[targetChunk].cOffset;
|
||||
zds->decompressedOffset = jt->entries[targetChunk].dOffset;
|
||||
zds->nextSeek = jt->entries[targetFrame].cOffset;
|
||||
zds->decompressedOffset = jt->entries[targetFrame].dOffset;
|
||||
/* signal to user that a seek is required */
|
||||
return ERROR(needSeek);
|
||||
}
|
||||
|
Reference in New Issue
Block a user