UDocumentation
UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
binkbits.h
Go to the documentation of this file.
1
// Copyright Epic Games, Inc. All Rights Reserved.
2
3
#ifndef __RADRR_COREH__
4
#include "
rrCore.h
"
5
#endif
6
7
#if !defined(__RAD64__)
// 32-bit path
8
9
typedef
struct
BINKVARBITS
{
void
*
cur
;
U32
bits
;
U32
bitlen
; }
BINKVARBITS
;
10
11
#define BINKBITSLOCALS( name ) void * name##cur; U32 name##bits; U32 name##bitlen
12
#define BinkVarBitsOpen(vb,pointer) { (vb).bits=BINK_LOAD32(pointer); (vb).cur=((char*)pointer)+4; (vb).bitlen = 32; }
13
14
// only on big endian, does this do anything (it's for when you don't preflip the data)
15
#if defined(__RADEMSCRIPTEN__)
16
#include <emscripten.h>
17
#define BINK_LOAD32(ptr) ((U32)*((emscripten_align1_int*)(ptr)))
18
#else
19
#if defined(BINKAUDIODATALE)
20
#define BINK_LOAD32(ptr) RR_GET32_LE(ptr)
21
#else
22
#define BINK_LOAD32(ptr) RR_GET32_NATIVE(ptr)
23
#endif
24
#endif
25
26
#define BinkBitsGet(v,typ,vb,len,mask) \
27
{ \
28
if ((vb##bitlen)<(len)) { \
29
register U32 nb=BINK_LOAD32((U32* RADRESTRICT)(vb##cur)); \
30
v=(typ)(((vb##bits)|(nb<<(vb##bitlen)))&(mask)); \
31
(vb##bits)=nb>>((len)-(vb##bitlen)); \
32
(vb##bitlen)=(vb##bitlen)+32-(len); \
33
(vb##cur)=((char*)(vb##cur))+4; \
34
} else { \
35
v=(typ)((vb##bits)&(mask)); \
36
(vb##bits)>>=(len); \
37
(vb##bitlen)-=(len); \
38
} \
39
}
40
41
#if defined(__RADLITTLEENDIAN__)
42
43
#define MAX_AT_LEAST_BITS 25
44
45
// load as many bytes as we can each load on little endian (unaligned loads)
46
#define BinkBitsAtLeastStart( vb,len ) \
47
{ \
48
if ((vb##bitlen)<(len)) { \
49
U32 bl=((32-(vb##bitlen))>>3); \
50
U32 nb=BINK_LOAD32((U32* RADRESTRICT)(vb##cur)); \
51
(vb##bits)=((vb##bits)|(nb<<(vb##bitlen))); \
52
(vb##cur)=((char*)(vb##cur))+bl; \
53
(vb##bitlen)=(vb##bitlen)+(bl<<3); \
54
} \
55
}
56
57
#define BinkBitsAtLeastEnd(vb)
58
59
#else
60
61
#define MAX_AT_LEAST_BITS 32
62
63
// when running on big endian, we can load 32-bits at a time, but only
64
// advance in the End state, not the start - this keeps us aligned
65
#define BinkBitsAtLeastStart( vb,len ) \
66
{ \
67
if ((vb##bitlen)<(len)) \
68
{ \
69
U32 nb=BINK_LOAD32((U32* RADRESTRICT)(vb##cur)); \
70
(vb##bits)=((vb##bits)|(nb<<(vb##bitlen))); \
71
} \
72
}
73
74
#define BinkBitsAtLeastEnd(vb) \
75
{ \
76
if ( ( (S32)(vb##bitlen) ) <= 0 ) \
77
{ \
78
(vb##bits)=BINK_LOAD32(((U32* RADRESTRICT)(vb##cur)))>>(-(S32)(vb##bitlen)); \
79
(vb##cur)=((char*)(vb##cur))+4; \
80
(vb##bitlen)=(vb##bitlen)+32; \
81
} \
82
}
83
84
#endif
85
86
#else
87
88
typedef
struct
BINKVARBITS
{
void
*
cur
;
U64
bits
;
U32
bitlen
; }
BINKVARBITS
;
89
90
#define BINKBITSLOCALS( name ) void * name##cur; U64 name##bits; U32 name##bitlen
91
#define BinkVarBitsOpen(vb,pointer) { (vb).bits=*(U64*)(pointer); (vb).cur=((char*)pointer)+8; (vb).bitlen = 64; }
92
93
#define BINK_LOAD32 RR_GET32_NATIVE
94
95
#define BinkBitsGet(v,typ,vb,len,mask) \
96
{ \
97
if ((vb##bitlen)<(len)) { \
98
U64 nb=*((U64* RADRESTRICT)(vb##cur)); \
99
v=(typ)(((vb##bits)|(nb<<(vb##bitlen)))&(mask)); \
100
(vb##bits)=nb>>((len)-(vb##bitlen)); \
101
(vb##bitlen)=(vb##bitlen)+64-(len); \
102
(vb##cur)=((char*)(vb##cur))+8; \
103
} else { \
104
v=(typ)((vb##bits)&(mask)); \
105
(vb##bits)>>=(len); \
106
(vb##bitlen)-=(len); \
107
} \
108
}
109
110
#define MAX_AT_LEAST_BITS 57
111
112
#define BinkBitsAtLeastStart( vb,len ) \
113
{ \
114
if ((vb##bitlen)<(len)) \
115
{ \
116
U32 bl=((64-(vb##bitlen))>>3); \
117
U64 nb=*((U64* RADRESTRICT)(vb##cur)); \
118
(vb##bits)=((vb##bits)|(nb<<(vb##bitlen))); \
119
(vb##cur)=((char*)(vb##cur))+bl; \
120
(vb##bitlen)=(vb##bitlen)+(bl<<3); \
121
} \
122
}
123
124
#define BinkBitsAtLeastEnd( vb )
125
126
#define VarBits32Use(vb,len) { (vb).bits >>= (len); (vb).bitlen -= (len); }
127
128
#define MAX_PEEK 64
129
130
#endif
131
132
#define BINKBITSCOPY(name, from) { name##cur = from##cur; name##bits = from##bits; name##bitlen = from##bitlen; }
133
134
#define BinkBitsInAtLeastPeek(vb) ( vb##bits )
135
#define BinkBitsInAtLeastUse( vb, bl ) { (vb##bits) >>= (bl); (vb##bitlen) -= (bl); }
136
137
#define BinkBitsPeek(v, typ, vb, len) \
138
{ \
139
BinkBitsAtLeastStart( vb, len ) \
140
(v)=(typ)BinkBitsInAtLeastPeek( vb ); \
141
}
142
143
#define BinkBitsUse( vb, bl ) { BinkBitsInAtLeastUse( vb, bl ); BinkBitsAtLeastEnd( vb ); }
144
145
#define BinkVarBitsUse(vb,len) { (vb).bits >>= (len); (vb).bitlen -= (len); }
146
147
#define VarBitsCopyToBinkBits( local, vb ) local##cur = (vb).cur; local##bits = (vb).bits; local##bitlen = (vb).bitlen;
148
#define BinkBitsCopyToVarBits( vb, local ) { (vb).cur = local##cur; (vb).bits = local##bits; (vb).bitlen = local##bitlen; }
149
150
#define BinkBitsSizeBytesRoundedToU32( local, base ) ((((((U8*)(local##cur))-((U8*)base))-(local##bitlen/8))+3)&~3)
151
#define BinkVarBitsSizeBytesRoundedToU32( vb, base ) ((((((U8*)((vb).cur))-((U8*)base))-((vb).bitlen/8))+3)&~3)
U32
RAD_U32 U32
Definition
egttypes.h:501
U64
RAD_U64 U64
Definition
egttypes.h:511
rrCore.h
BINKVARBITS
Definition
binkbits.h:9
BINKVARBITS::bits
U32 bits
Definition
binkbits.h:9
BINKVARBITS::bitlen
U32 bitlen
Definition
binkbits.h:9
BINKVARBITS::cur
void * cur
Definition
binkbits.h:9
Engine
Source
Runtime
BinkAudioDecoder
SDK
BinkAudio
Src
binkbits.h
Generated by
1.9.8