Skip to content

Commit 209ba1c

Browse files
committed
* remove reliance on endianness
* make it optional to include the vpx_norm array.
1 parent 4141e1d commit 209ba1c

1 file changed

Lines changed: 12 additions & 28 deletions

File tree

vpxcoding.h

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
#include <stdint.h>
3333
#include <limits.h>
3434
#include <string.h>
35-
#include <endian.h>
3635

3736
#ifdef __cplusplus
3837
extern "C" {
@@ -44,23 +43,7 @@ extern "C" {
4443
#define VPXCODING_IMPLEMENTATION
4544
#endif
4645

47-
#ifdef VPXCODING_NOTABLE
48-
VPXCODING_DECORATOR uint8_t vpx_norm( uint8_t n )
49-
{
50-
return __builtin_clz(n) & 7;
51-
#if 0
52-
// Implementation for systems w/o clz.
53-
if( n == 0 ) return 0; // I don't think this is needed
54-
int i = 7;
55-
if( n >= 16 ) { i -= 4; n >>= 4; }
56-
if( n >= 8 ) { i -= 3; n >>= 3; }
57-
if( n >= 4 ) { i -= 2; n >>= 2; }
58-
if( n >= 2 ) { i -= 1; n >>= 1; }
59-
return i;
60-
#endif
61-
}
62-
#define VPXCODING_VPXNORM(x) vpx_norm(x)
63-
#else
46+
#ifndef VPXCODING_CUSTOM_VPXNORM
6447
static const uint8_t vpx_norm[256] = {
6548
0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
6649
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
@@ -79,9 +62,8 @@ static const uint8_t vpx_norm[256] = {
7962
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8063
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
8164
};
82-
83-
#define VPXCODING_VPXNORM( x ) vpx_norm[x]
8465
#endif
66+
8567
#ifdef VPXCODING_READER
8668

8769
// This is meant to be a large, positive constant that can still be
@@ -193,12 +175,13 @@ VPXCODING_DECORATOR void vpx_reader_fill(vpx_reader *r)
193175
if (bits_left > BD_VALUE_SIZE) {
194176
const int bits = (shift & 0xfffffff8) + CHAR_BIT;
195177
BD_VALUE nv;
196-
BD_VALUE big_endian_values;
197-
memcpy(&big_endian_values, buffer, sizeof(BD_VALUE));
178+
BD_VALUE big_endian_values = 0;
179+
int n;
198180
#ifdef VPX_64BIT
199-
big_endian_values = htobe64(big_endian_values);
181+
// Formulated a little unusually, but selected by looking through different godbolt outputs, comparing this and |= (buffer[n]<<(56-n*8))
182+
for( n = 0; n < 8; n++ ) big_endian_values = (big_endian_values<<8) | buffer[n];
200183
#else
201-
big_endian_values = htobe32(big_endian_values);
184+
for( n = 0; n < 4; n++ ) big_endian_values = (big_endian_values<<8) | buffer[n];
202185
#endif
203186
nv = big_endian_values >> (BD_VALUE_SIZE - bits);
204187
count += bits;
@@ -280,7 +263,7 @@ VPXCODING_DECORATOR int vpx_read(vpx_reader *r, int prob) {
280263
}
281264

282265
{
283-
const unsigned char shift = VPXCODING_VPXNORM((unsigned char)range);
266+
const unsigned char shift = vpx_norm[(unsigned char)range];
284267
range <<= shift;
285268
value <<= shift;
286269
count -= shift;
@@ -342,7 +325,7 @@ VPXCODING_DECORATOR void vpx_start_encode(vpx_writer *br, uint8_t *source, size_
342325
// Returns 0 on success and returns -1 in case of error.
343326
VPXCODING_DECORATOR int vpx_stop_encode(vpx_writer *br);
344327

345-
VPXCODING_DECORATOR VPX_NO_UNSIGNED_SHIFT_CHECK void vpx_write(vpx_writer *br,
328+
static inline VPX_NO_UNSIGNED_SHIFT_CHECK void vpx_write(vpx_writer *br,
346329
int bit, int probability);
347330

348331
static inline void vpx_write_bit(vpx_writer *w, int bit) {
@@ -355,7 +338,7 @@ static inline void vpx_write_literal(vpx_writer *w, int data, int bits) {
355338
}
356339

357340

358-
VPXCODING_DECORATOR VPX_NO_UNSIGNED_SHIFT_CHECK void vpx_write(vpx_writer *br,
341+
static inline VPX_NO_UNSIGNED_SHIFT_CHECK void vpx_write(vpx_writer *br,
359342
int bit, int probability) {
360343
unsigned int split;
361344
int count = br->count;
@@ -385,7 +368,7 @@ VPXCODING_DECORATOR VPX_NO_UNSIGNED_SHIFT_CHECK void vpx_write(vpx_writer *br,
385368
range = br->range - split;
386369
}
387370

388-
shift = VPXCODING_VPXNORM(range);
371+
shift = vpx_norm[range];
389372

390373
range <<= shift;
391374
count += shift;
@@ -477,3 +460,4 @@ VPXCODING_DECORATOR int vpx_stop_encode(vpx_writer *br) {
477460

478461
#endif
479462

463+

0 commit comments

Comments
 (0)