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