3232#include <stdint.h>
3333#include <limits.h>
3434#include <string.h>
35- #include <endian.h>
3635
3736#ifdef __cplusplus
3837extern "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
6447static 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.
343326VPXCODING_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
348331static 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