37 virtual void read(
void* dest,
size_t count) = 0;
38 virtual void seek(
size_t pos) = 0;
39 virtual void skip(
size_t count) = 0;
62 const Frame&
frame(uint8_t i)
const {
return frames[i]; };
64 const Audio&
audio(uint8_t i)
const {
return audProp[i]; }
71 enum BinkVidFlags : uint32_t {
73 BINK_FLAG_ALPHA = 0x00100000,
74 BINK_FLAG_GRAY = 0x00020000,
76 enum BinkAudFlags : uint16_t {
77 BINK_AUD_16BITS = 0x4000,
78 BINK_AUD_STEREO = 0x2000,
79 BINK_AUD_USEDCT = 0x1000,
83 BINK_SRC_BLOCK_TYPES = 0,
84 BINK_SRC_SUB_BLOCK_TYPES,
112 BINK_BLOCK_MAX_SIZE = (MAX_CHANNELS << 11)
117 uint16_t sampleRate=0;
124 bool keyFrame =
false;
129 uint8_t syms[16] = {};
132 struct Bundle final {
135 std::vector<uint8_t> data;
136 uint8_t* data_end =
nullptr;
137 uint8_t* cur_dec =
nullptr;
138 uint8_t* cur_ptr =
nullptr;
141 struct AudioCtx final {
142 AudioCtx(uint16_t sampleRate, uint8_t channelsCnt,
bool isDct);
144 std::vector<float> samples[MAX_CHANNELS];
146 uint32_t sampleRate = 44100;
147 uint8_t channelsCnt = 1;
149 uint32_t frameLen = 0;
150 uint32_t overlapLen = 0;
152 const bool isDct =
false;
154 uint32_t bands[26] = {};
155 uint32_t numBands = 0;
157 const float* tcos =
nullptr;
158 const float* tsin =
nullptr;
160 std::vector<uint16_t> revtab;
161 std::vector<uint32_t> revtab32;
162 std::vector<float> csc2;
164 std::vector<FFTComplex> tmpBuf;
165 float previous[MAX_CHANNELS][BINK_BLOCK_MAX_SIZE/16];
174 void merge(BitStream& gb, uint8_t *dst, uint8_t *src,
int size);
177 void decodeAudioInit(AudioCtx& s);
179 int setIdx (BitStream& gb,
int code,
int& n,
int& nb_bits,
const int16_t (*table)[2]);
180 uint8_t getHuff(BitStream& gb,
const Tree& tree);
181 int getVlc2(BitStream& gb, int16_t (*table)[2],
int bits,
int max_depth);
183 void parseFrame(
const std::vector<uint8_t>& data);
184 void decodePlane(BitStream& gb,
int planeId,
bool chroma);
185 void initLengths(
int width,
int bw);
186 void readBundle(BitStream& gb,
int bundle_num);
187 void readTree(BitStream& gb, Tree& tree);
189 void readBlockTypes (BitStream& gb, Bundle& b);
190 void readColors (BitStream& gb, Bundle& b);
191 void readPatterns (BitStream& gb, Bundle& b);
192 void readMotionValues(BitStream& gb, Bundle& b);
193 void readDcs (BitStream& gb, Bundle& b,
int start_bits,
int has_sign);
194 void readRuns (BitStream& gb, Bundle& b);
195 int readDctCoeffs (BitStream& gb, int32_t block[],
const uint8_t* scan,
196 int& coef_count_,
int coef_idx[],
int q);
197 void unquantizeDctCoeffs(int32_t block[],
const uint32_t quant[],
198 int coef_count,
int coef_idx[],
const uint8_t* scan);
199 void readResidue (BitStream& gb, int16_t block[],
int masks_count);
200 int getValue(Sources bundle);
202 static bool checkReadVal(BitStream& gb, Bundle& b, T& t);
204 void initFfCosTabs(
size_t index);
205 void parseAudio(
const std::vector<uint8_t>& data,
size_t id);
206 void parseAudioBlock(BitStream& gb, AudioCtx& track);
207 void dctCalc3C (AudioCtx& aud,
float* data);
208 void rdftCalcC (AudioCtx& aud,
float* data,
bool negativeSign);
210 void fftPermute(AudioCtx& aud, FFTComplex* z);
211 void fftCalc (
const AudioCtx& aud, FFTComplex* z);
213 Input* fin =
nullptr;
214 uint8_t revision = 0;
215 BinkVidFlags flags = BINK_FLAG_NONE;
218 uint32_t smush_size = 0;
219 bool swap_planes =
false;
221 std::vector<Audio> audProp;
222 std::vector<AudioCtx> aud;
223 std::vector<Index> index;
226 Frame frames[2] = {};
228 std::vector<uint8_t> packet;
229 uint32_t frameCounter = 0;
232 Bundle bundle[BINK_NB_SRC] = {};
237 float quantTable[96] = {};