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
9typedef 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
88typedef 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)
RAD_U32 U32
Definition egttypes.h:501
RAD_U64 U64
Definition egttypes.h:511
Definition binkbits.h:9
U32 bits
Definition binkbits.h:9
U32 bitlen
Definition binkbits.h:9
void * cur
Definition binkbits.h:9