124 lines
4.9 KiB
C
124 lines
4.9 KiB
C
/**
|
|
* @file transcode.h
|
|
* @author Yu Zhong (lx1zhong@qq.com)
|
|
* @brief Header file for ADT-FSE algorithm
|
|
* @date 2022-08-25
|
|
*
|
|
* @copyright Copyright (c) 2022
|
|
*
|
|
*/
|
|
|
|
#ifndef _Transcode_H
|
|
#define _Transcode_H
|
|
#include "sz.h"
|
|
#include "mem.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#ifdef WINDOWS
|
|
int32_t BUILDIN_CLZ_EX(uint32_t val);
|
|
#else
|
|
#define BUILDIN_CLZ_EX(val) __builtin_clz(val)
|
|
#endif
|
|
|
|
/**
|
|
* dict = {
|
|
0: [0,0], 1:[1,0], 2:[2,0], 3:[3,0],
|
|
4: [4,0], 5:[5,0], 6:[6,0], 7:[7,0],
|
|
8: [8,0], 9:[9,0], 10:[10,0], 11:[11,0],
|
|
12: [12,0], 13:[13,0], 14:[14,0], 15:[15,0],
|
|
16: [16,1], 18:[17,1], 20:[18,1], 22:[19,1],
|
|
24: [20,2], 28:[21,2], 32:[22,3], 40:[23,3],
|
|
48: [24,4], 64:[25,6], 128:[26,7], 256:[27,8],
|
|
512: [28,9], 1024:[29,10], 2048:[30,11], 4096:[31,12],
|
|
8192: [32,13], 16384:[33,14],
|
|
-8192: [35,13], -16384:[34,14],
|
|
-512: [39,9], -1024:[38,10], -2048:[37,11], -4096:[36,12],
|
|
-48: [43,4], -64:[42,6], -128:[41,7], -256:[40,8],
|
|
-24: [47,2], -28:[46,2], -32:[45,3], -40:[44,3],
|
|
-16: [51,1], -18:[50,1], -20:[49,1], -22:[48,1],
|
|
-12: [55,0], -13:[54,0], -14:[53,0], -15:[52,0],
|
|
-8: [59,0], -9:[58,0], -10:[57,0], -11:[56,0],
|
|
-4: [63,0], -5:[62,0], -6:[61,0], -7:[60,0],
|
|
-1:[66,0], -2:[65,0], -3:[64,0],
|
|
#-16384:[67,0]
|
|
}
|
|
*
|
|
*/
|
|
|
|
MEM_STATIC int Int2code(int factor)
|
|
{
|
|
static const uint8_t Ft_Code[64] = { 0, 1, 2, 3, 4, 5, 6, 7,
|
|
8, 9, 10, 11, 12, 13, 14, 15,
|
|
16, 16, 17, 17, 18, 18, 19, 19,
|
|
20, 20, 20, 20, 21, 21, 21, 21,
|
|
22, 22, 22, 22, 22, 22, 22, 22,
|
|
23, 23, 23, 23, 23, 23, 23, 23,
|
|
24, 24, 24, 24, 24, 24, 24, 24,
|
|
24, 24, 24, 24, 24, 24, 24, 24 };
|
|
if (factor >= 0)
|
|
return (factor > 63) ? 50 - BUILDIN_CLZ_EX(factor) : Ft_Code[factor];
|
|
else {
|
|
factor = -factor;
|
|
return (factor > 63) ? 17 + BUILDIN_CLZ_EX(factor) : 67 - Ft_Code[factor];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* reverse_dict = {
|
|
0: [0,0], 1:[1,0], 2:[2,0], 3:[3,0],
|
|
4: [4,0], 5:[5,0], 6:[6,0], 7:[7,0],
|
|
8: [8,0], 9:[9,0], 10:[10,0], 11:[11,0],
|
|
12: [12,0], 13:[13,0], 14:[14,0], 15:[15,0],
|
|
16: [16,1], 17:[18,1], 18:[20,1], 19:[22,1],
|
|
20: [24,2], 21:[28,2], 22:[32,3], 23:[40,3],
|
|
24: [48,4], 25:[64,6], 26:[128,7], 27:[256,8],
|
|
28: [512,9], 29:[1024,10], 30:[2048,11], 31:[4096,12],
|
|
32: [8192,13], 33:[16384,14],
|
|
35:[-8192,13], 34:[-16384,14],
|
|
39:[-512,9], 38:[-1024,10], 37:[-2048,11], 36:[-4096,12],
|
|
43:[-48,4], 42:[-64,6], 41:[-128,7], 40:[-256,8],
|
|
47:[-24,2], 46:[-28,2], 45:[-32,3], 44:[-40,3],
|
|
51:[-16,1], 50:[-18,1], 49:[-20,1], 48:[-22,1],
|
|
55:[-12,0], 54:[-13,0], 53:[-14,0], 52:[-15,0],
|
|
59:[-8,0], 58:[-9,0], 57:[-10,0], 56:[-11,0],
|
|
63:[-4,0], 62:[-5,0], 61:[-6,0], 60:[-7,0],
|
|
66:[-1,0], 65:[-2,0], 64:[-3,0],
|
|
#67:[-16384,0]
|
|
}
|
|
*
|
|
*/
|
|
static const int code2int[67][2] = { {0,0},{1,0},{2,0},{3,0},
|
|
{4,0},{5,0},{6,0},{7,0},
|
|
{8,0},{9,0},{10,0},{11,0},
|
|
{12,0},{13,0},{14,0},{15,0},
|
|
{16,1},{18,1},{20,1},{22,1},
|
|
{24,2},{28,2},{32,3},{40,3},
|
|
{48,4},{64,6},{128,7},{256,8},
|
|
{512,9},{1024,10},{2048,11},{4096,12},
|
|
{8192,13},{16384,14},
|
|
{-16384,14}, {-8192,13},
|
|
{-4096,12},{-2048,11},{-1024,10},{-512,9},
|
|
{-256,8},{-128,7},{-64,6},{-48,4},
|
|
{-40,3},{-32,3},{-28,2},{-24,2},
|
|
{-22,1},{-20,1},{-18,1},{-16,1},
|
|
{-15,0},{-14,0},{-13,0},{-12,0},
|
|
{-11,0},{-10,0},{-9,0},{-8,0},
|
|
{-7,0},{-6,0},{-5,0},{-4,0},
|
|
{-3,0},{-2,0},{-1,0} };
|
|
|
|
void encode_with_fse(int *type, size_t dataSeriesLength, unsigned int intervals,
|
|
unsigned char **FseCode, size_t *FseCode_size,
|
|
unsigned char **transCodeBits, size_t *transCodeBits_size);
|
|
void decode_with_fse(int *type, size_t dataSeriesLength, unsigned int intervals,
|
|
unsigned char *FseCode, size_t FseCode_size,
|
|
unsigned char *transCodeBits, size_t transCodeBits_size);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif |