1 typedef signed char int8_t;
3 typedef unsigned char uint8_t;
4 typedef unsigned int uint32_t;
6 union unaligned_32
{uint32_t l
;} __attribute__((packed
)) __attribute__((may_alias
));
7 static inline uint32_t NEG_USR32(uint32_t a
, int8_t s
){return a
<< (32 - s
);}
8 typedef struct GetBitContext
{ const uint8_t *buffer
, *buffer_end
; int index
;}GetBitContext
;
9 typedef struct VLC
{int16_t (*table
)[2];} VLC
;
10 static __attribute__((always_inline
)) inline int get_vlc2(GetBitContext
*s
, int16_t (*table
)[2], int bits
, int max_depth
) {
11 unsigned int re_index
= (s
)->index
;
16 index
= NEG_USR32(re_cache
, bits
);
18 if(max_depth
> 1 && n
< 0){
19 re_cache
= bswap_32((((const union unaligned_32
*) (((const uint8_t *)(s
)->buffer
)+(re_index
>>3)))->l
)) << (re_index
&0x07);
23 typedef struct HYuvContext
{GetBitContext gb
; int decorrelate
; int bitstream_bpp
; uint8_t *temp
[3]; VLC vlc
[6];} HYuvContext
;
24 static __attribute__((always_inline
)) inline void decode_bgr_1(HYuvContext
*s
, int count
, int decorrelate
, int alpha
){
26 int code
= get_vlc2(&s
->gb
, s
->vlc
[3].table
, 11, 1);
28 s
->temp
[0][4*i
+0] = get_vlc2(&s
->gb
, s
->vlc
[0].table
, 11, 3);
29 s
->temp
[0][4*i
+1] = get_vlc2(&s
->gb
, s
->vlc
[1].table
, 11, 3);
30 s
->temp
[0][4*i
+2] = get_vlc2(&s
->gb
, s
->vlc
[2].table
, 11, 3);
33 void decode_bgr_bitstream(HYuvContext
*s
, int count
){
35 if(s
->bitstream_bpp
==24) decode_bgr_1(s
, count
, 1, 0);
36 else decode_bgr_1(s
, count
, 1, 1);