xref: /aosp_15_r20/external/libvpx/vp8/encoder/boolhuff.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker /****************************************************************************
12*fb1b10abSAndroid Build Coastguard Worker  *
13*fb1b10abSAndroid Build Coastguard Worker  *   Module Title :     boolhuff.h
14*fb1b10abSAndroid Build Coastguard Worker  *
15*fb1b10abSAndroid Build Coastguard Worker  *   Description  :     Bool Coder header file.
16*fb1b10abSAndroid Build Coastguard Worker  *
17*fb1b10abSAndroid Build Coastguard Worker  ****************************************************************************/
18*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP8_ENCODER_BOOLHUFF_H_
19*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP8_ENCODER_BOOLHUFF_H_
20*fb1b10abSAndroid Build Coastguard Worker 
21*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "vpx/internal/vpx_codec_internal.h"
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
25*fb1b10abSAndroid Build Coastguard Worker extern "C" {
26*fb1b10abSAndroid Build Coastguard Worker #endif
27*fb1b10abSAndroid Build Coastguard Worker 
28*fb1b10abSAndroid Build Coastguard Worker typedef struct {
29*fb1b10abSAndroid Build Coastguard Worker   unsigned int lowvalue;
30*fb1b10abSAndroid Build Coastguard Worker   unsigned int range;
31*fb1b10abSAndroid Build Coastguard Worker   int count;
32*fb1b10abSAndroid Build Coastguard Worker   unsigned int pos;
33*fb1b10abSAndroid Build Coastguard Worker   unsigned char *buffer;
34*fb1b10abSAndroid Build Coastguard Worker   unsigned char *buffer_end;
35*fb1b10abSAndroid Build Coastguard Worker   struct vpx_internal_error_info *error;
36*fb1b10abSAndroid Build Coastguard Worker } BOOL_CODER;
37*fb1b10abSAndroid Build Coastguard Worker 
38*fb1b10abSAndroid Build Coastguard Worker void vp8_start_encode(BOOL_CODER *bc, unsigned char *source,
39*fb1b10abSAndroid Build Coastguard Worker                       unsigned char *source_end);
40*fb1b10abSAndroid Build Coastguard Worker 
41*fb1b10abSAndroid Build Coastguard Worker void vp8_encode_value(BOOL_CODER *bc, int data, int bits);
42*fb1b10abSAndroid Build Coastguard Worker void vp8_stop_encode(BOOL_CODER *bc);
43*fb1b10abSAndroid Build Coastguard Worker extern const unsigned int vp8_prob_cost[256];
44*fb1b10abSAndroid Build Coastguard Worker 
45*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]);
46*fb1b10abSAndroid Build Coastguard Worker 
validate_buffer(const unsigned char * start,size_t len,const unsigned char * end,struct vpx_internal_error_info * error)47*fb1b10abSAndroid Build Coastguard Worker static int validate_buffer(const unsigned char *start, size_t len,
48*fb1b10abSAndroid Build Coastguard Worker                            const unsigned char *end,
49*fb1b10abSAndroid Build Coastguard Worker                            struct vpx_internal_error_info *error) {
50*fb1b10abSAndroid Build Coastguard Worker   if (start + len > start && start + len < end) {
51*fb1b10abSAndroid Build Coastguard Worker     return 1;
52*fb1b10abSAndroid Build Coastguard Worker   } else {
53*fb1b10abSAndroid Build Coastguard Worker     vpx_internal_error(error, VPX_CODEC_CORRUPT_FRAME,
54*fb1b10abSAndroid Build Coastguard Worker                        "Truncated packet or corrupt partition ");
55*fb1b10abSAndroid Build Coastguard Worker   }
56*fb1b10abSAndroid Build Coastguard Worker 
57*fb1b10abSAndroid Build Coastguard Worker   return 0;
58*fb1b10abSAndroid Build Coastguard Worker }
vp8_encode_bool(BOOL_CODER * bc,int bit,int probability)59*fb1b10abSAndroid Build Coastguard Worker static void vp8_encode_bool(BOOL_CODER *bc, int bit, int probability) {
60*fb1b10abSAndroid Build Coastguard Worker   unsigned int split;
61*fb1b10abSAndroid Build Coastguard Worker   int count = bc->count;
62*fb1b10abSAndroid Build Coastguard Worker   unsigned int range = bc->range;
63*fb1b10abSAndroid Build Coastguard Worker   unsigned int lowvalue = bc->lowvalue;
64*fb1b10abSAndroid Build Coastguard Worker   int shift;
65*fb1b10abSAndroid Build Coastguard Worker 
66*fb1b10abSAndroid Build Coastguard Worker   split = 1 + (((range - 1) * probability) >> 8);
67*fb1b10abSAndroid Build Coastguard Worker 
68*fb1b10abSAndroid Build Coastguard Worker   range = split;
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker   if (bit) {
71*fb1b10abSAndroid Build Coastguard Worker     lowvalue += split;
72*fb1b10abSAndroid Build Coastguard Worker     range = bc->range - split;
73*fb1b10abSAndroid Build Coastguard Worker   }
74*fb1b10abSAndroid Build Coastguard Worker 
75*fb1b10abSAndroid Build Coastguard Worker   shift = vp8_norm[range];
76*fb1b10abSAndroid Build Coastguard Worker 
77*fb1b10abSAndroid Build Coastguard Worker   range <<= shift;
78*fb1b10abSAndroid Build Coastguard Worker   count += shift;
79*fb1b10abSAndroid Build Coastguard Worker 
80*fb1b10abSAndroid Build Coastguard Worker   if (count >= 0) {
81*fb1b10abSAndroid Build Coastguard Worker     int offset = shift - count;
82*fb1b10abSAndroid Build Coastguard Worker 
83*fb1b10abSAndroid Build Coastguard Worker     if ((lowvalue << (offset - 1)) & 0x80000000) {
84*fb1b10abSAndroid Build Coastguard Worker       int x = bc->pos - 1;
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker       while (x >= 0 && bc->buffer[x] == 0xff) {
87*fb1b10abSAndroid Build Coastguard Worker         bc->buffer[x] = (unsigned char)0;
88*fb1b10abSAndroid Build Coastguard Worker         x--;
89*fb1b10abSAndroid Build Coastguard Worker       }
90*fb1b10abSAndroid Build Coastguard Worker 
91*fb1b10abSAndroid Build Coastguard Worker       bc->buffer[x] += 1;
92*fb1b10abSAndroid Build Coastguard Worker     }
93*fb1b10abSAndroid Build Coastguard Worker 
94*fb1b10abSAndroid Build Coastguard Worker     validate_buffer(bc->buffer + bc->pos, 1, bc->buffer_end, bc->error);
95*fb1b10abSAndroid Build Coastguard Worker     bc->buffer[bc->pos++] = (lowvalue >> (24 - offset) & 0xff);
96*fb1b10abSAndroid Build Coastguard Worker 
97*fb1b10abSAndroid Build Coastguard Worker     shift = count;
98*fb1b10abSAndroid Build Coastguard Worker     lowvalue = (int)(((uint64_t)lowvalue << offset) & 0xffffff);
99*fb1b10abSAndroid Build Coastguard Worker     count -= 8;
100*fb1b10abSAndroid Build Coastguard Worker   }
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker   lowvalue <<= shift;
103*fb1b10abSAndroid Build Coastguard Worker   bc->count = count;
104*fb1b10abSAndroid Build Coastguard Worker   bc->lowvalue = lowvalue;
105*fb1b10abSAndroid Build Coastguard Worker   bc->range = range;
106*fb1b10abSAndroid Build Coastguard Worker }
107*fb1b10abSAndroid Build Coastguard Worker 
108*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
109*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
110*fb1b10abSAndroid Build Coastguard Worker #endif
111*fb1b10abSAndroid Build Coastguard Worker 
112*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VP8_ENCODER_BOOLHUFF_H_
113