Line | Count | Source |
1 | | /***************************************************************************** |
2 | | * cabac.h: arithmetic coder |
3 | | ***************************************************************************** |
4 | | * Copyright (C) 2003-2025 x264 project |
5 | | * |
6 | | * Authors: Loren Merritt <lorenm@u.washington.edu> |
7 | | * Laurent Aimar <fenrir@via.ecp.fr> |
8 | | * |
9 | | * This program is free software; you can redistribute it and/or modify |
10 | | * it under the terms of the GNU General Public License as published by |
11 | | * the Free Software Foundation; either version 2 of the License, or |
12 | | * (at your option) any later version. |
13 | | * |
14 | | * This program is distributed in the hope that it will be useful, |
15 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | | * GNU General Public License for more details. |
18 | | * |
19 | | * You should have received a copy of the GNU General Public License |
20 | | * along with this program; if not, write to the Free Software |
21 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. |
22 | | * |
23 | | * This program is also available under a commercial proprietary license. |
24 | | * For more information, contact us at licensing@x264.com. |
25 | | *****************************************************************************/ |
26 | | |
27 | | #ifndef X264_CABAC_H |
28 | | #define X264_CABAC_H |
29 | | |
30 | | typedef struct |
31 | | { |
32 | | /* state */ |
33 | | int i_low; |
34 | | int i_range; |
35 | | |
36 | | /* bit stream */ |
37 | | int i_queue; //stored with an offset of -8 for faster asm |
38 | | int i_bytes_outstanding; |
39 | | |
40 | | uint8_t *p_start; |
41 | | uint8_t *p; |
42 | | uint8_t *p_end; |
43 | | |
44 | | /* aligned for memcpy_aligned starting here */ |
45 | | ALIGNED_64( int f8_bits_encoded ); // only if using x264_cabac_size_decision() |
46 | | |
47 | | /* context */ |
48 | | uint8_t state[1024]; |
49 | | |
50 | | /* for 16-byte alignment */ |
51 | | uint8_t padding[12]; |
52 | | } x264_cabac_t; |
53 | | |
54 | | /* init the contexts given i_slice_type, the quantif and the model */ |
55 | 0 | #define x264_cabac_context_init x264_template(cabac_context_init) |
56 | | void x264_cabac_context_init( x264_t *h, x264_cabac_t *cb, int i_slice_type, int i_qp, int i_model ); |
57 | | |
58 | 0 | #define x264_cabac_encode_init_core x264_template(cabac_encode_init_core) |
59 | | void x264_cabac_encode_init_core( x264_cabac_t *cb ); |
60 | 0 | #define x264_cabac_encode_init x264_template(cabac_encode_init) |
61 | | void x264_cabac_encode_init( x264_cabac_t *cb, uint8_t *p_data, uint8_t *p_end ); |
62 | 0 | #define x264_cabac_encode_decision_c x264_template(cabac_encode_decision_c) |
63 | | void x264_cabac_encode_decision_c( x264_cabac_t *cb, int i_ctx, int b ); |
64 | | #define x264_cabac_encode_decision_asm x264_template(cabac_encode_decision_asm) |
65 | | void x264_cabac_encode_decision_asm( x264_cabac_t *cb, int i_ctx, int b ); |
66 | 0 | #define x264_cabac_encode_bypass_c x264_template(cabac_encode_bypass_c) |
67 | | void x264_cabac_encode_bypass_c( x264_cabac_t *cb, int b ); |
68 | | #define x264_cabac_encode_bypass_asm x264_template(cabac_encode_bypass_asm) |
69 | | void x264_cabac_encode_bypass_asm( x264_cabac_t *cb, int b ); |
70 | 0 | #define x264_cabac_encode_terminal_c x264_template(cabac_encode_terminal_c) |
71 | | void x264_cabac_encode_terminal_c( x264_cabac_t *cb ); |
72 | | #define x264_cabac_encode_terminal_asm x264_template(cabac_encode_terminal_asm) |
73 | | void x264_cabac_encode_terminal_asm( x264_cabac_t *cb ); |
74 | 0 | #define x264_cabac_encode_ue_bypass x264_template(cabac_encode_ue_bypass) |
75 | | void x264_cabac_encode_ue_bypass( x264_cabac_t *cb, int exp_bits, int val ); |
76 | 0 | #define x264_cabac_encode_flush x264_template(cabac_encode_flush) |
77 | | void x264_cabac_encode_flush( x264_t *h, x264_cabac_t *cb ); |
78 | | |
79 | | #if HAVE_MMX |
80 | | #define x264_cabac_encode_decision x264_cabac_encode_decision_asm |
81 | | #define x264_cabac_encode_bypass x264_cabac_encode_bypass_asm |
82 | | #define x264_cabac_encode_terminal x264_cabac_encode_terminal_asm |
83 | | #elif HAVE_AARCH64 |
84 | | #define x264_cabac_encode_decision x264_cabac_encode_decision_asm |
85 | | #define x264_cabac_encode_bypass x264_cabac_encode_bypass_asm |
86 | | #define x264_cabac_encode_terminal x264_cabac_encode_terminal_asm |
87 | | #else |
88 | 0 | #define x264_cabac_encode_decision x264_cabac_encode_decision_c |
89 | 0 | #define x264_cabac_encode_bypass x264_cabac_encode_bypass_c |
90 | 0 | #define x264_cabac_encode_terminal x264_cabac_encode_terminal_c |
91 | | #endif |
92 | 0 | #define x264_cabac_encode_decision_noup x264_cabac_encode_decision |
93 | | |
94 | | static ALWAYS_INLINE int x264_cabac_pos( x264_cabac_t *cb ) |
95 | 0 | { |
96 | 0 | return (cb->p - cb->p_start + cb->i_bytes_outstanding) * 8 + cb->i_queue; |
97 | 0 | } Unexecuted instantiation: bitstream.c:x264_cabac_pos Unexecuted instantiation: encoder.c:x264_cabac_pos Unexecuted instantiation: lookahead.c:x264_cabac_pos Unexecuted instantiation: threadpool.c:x264_cabac_pos Unexecuted instantiation: mc.c:x264_cabac_pos Unexecuted instantiation: predict.c:x264_cabac_pos Unexecuted instantiation: pixel.c:x264_cabac_pos Unexecuted instantiation: macroblock.c:x264_cabac_pos Unexecuted instantiation: frame.c:x264_cabac_pos Unexecuted instantiation: dct.c:x264_cabac_pos Unexecuted instantiation: cabac.c:x264_cabac_pos Unexecuted instantiation: common.c:x264_cabac_pos Unexecuted instantiation: set.c:x264_cabac_pos Unexecuted instantiation: quant.c:x264_cabac_pos Unexecuted instantiation: deblock.c:x264_cabac_pos Unexecuted instantiation: vlc.c:x264_cabac_pos Unexecuted instantiation: mvpred.c:x264_cabac_pos Unexecuted instantiation: analyse.c:x264_cabac_pos Unexecuted instantiation: me.c:x264_cabac_pos Unexecuted instantiation: ratecontrol.c:x264_cabac_pos Unexecuted instantiation: cavlc.c:x264_cabac_pos Unexecuted instantiation: rectangle.c:x264_cabac_pos |
98 | | |
99 | | /* internal only. these don't write the bitstream, just calculate bit cost: */ |
100 | | |
101 | | static ALWAYS_INLINE void x264_cabac_size_decision( x264_cabac_t *cb, long i_ctx, long b ) |
102 | 0 | { |
103 | 0 | int i_state = cb->state[i_ctx]; |
104 | 0 | cb->state[i_ctx] = x264_cabac_transition[i_state][b]; |
105 | 0 | cb->f8_bits_encoded += x264_cabac_entropy[i_state^b]; |
106 | 0 | } Unexecuted instantiation: bitstream.c:x264_cabac_size_decision Unexecuted instantiation: encoder.c:x264_cabac_size_decision Unexecuted instantiation: lookahead.c:x264_cabac_size_decision Unexecuted instantiation: threadpool.c:x264_cabac_size_decision Unexecuted instantiation: mc.c:x264_cabac_size_decision Unexecuted instantiation: predict.c:x264_cabac_size_decision Unexecuted instantiation: pixel.c:x264_cabac_size_decision Unexecuted instantiation: macroblock.c:x264_cabac_size_decision Unexecuted instantiation: frame.c:x264_cabac_size_decision Unexecuted instantiation: dct.c:x264_cabac_size_decision Unexecuted instantiation: cabac.c:x264_cabac_size_decision Unexecuted instantiation: common.c:x264_cabac_size_decision Unexecuted instantiation: set.c:x264_cabac_size_decision Unexecuted instantiation: quant.c:x264_cabac_size_decision Unexecuted instantiation: deblock.c:x264_cabac_size_decision Unexecuted instantiation: vlc.c:x264_cabac_size_decision Unexecuted instantiation: mvpred.c:x264_cabac_size_decision Unexecuted instantiation: analyse.c:x264_cabac_size_decision Unexecuted instantiation: me.c:x264_cabac_size_decision Unexecuted instantiation: ratecontrol.c:x264_cabac_size_decision Unexecuted instantiation: cavlc.c:x264_cabac_size_decision Unexecuted instantiation: rectangle.c:x264_cabac_size_decision |
107 | | |
108 | | static ALWAYS_INLINE int x264_cabac_size_decision2( uint8_t *state, long b ) |
109 | 0 | { |
110 | 0 | int i_state = *state; |
111 | 0 | *state = x264_cabac_transition[i_state][b]; |
112 | 0 | return x264_cabac_entropy[i_state^b]; |
113 | 0 | } Unexecuted instantiation: bitstream.c:x264_cabac_size_decision2 Unexecuted instantiation: encoder.c:x264_cabac_size_decision2 Unexecuted instantiation: lookahead.c:x264_cabac_size_decision2 Unexecuted instantiation: threadpool.c:x264_cabac_size_decision2 Unexecuted instantiation: mc.c:x264_cabac_size_decision2 Unexecuted instantiation: predict.c:x264_cabac_size_decision2 Unexecuted instantiation: pixel.c:x264_cabac_size_decision2 Unexecuted instantiation: macroblock.c:x264_cabac_size_decision2 Unexecuted instantiation: frame.c:x264_cabac_size_decision2 Unexecuted instantiation: dct.c:x264_cabac_size_decision2 Unexecuted instantiation: cabac.c:x264_cabac_size_decision2 Unexecuted instantiation: common.c:x264_cabac_size_decision2 Unexecuted instantiation: set.c:x264_cabac_size_decision2 Unexecuted instantiation: quant.c:x264_cabac_size_decision2 Unexecuted instantiation: deblock.c:x264_cabac_size_decision2 Unexecuted instantiation: vlc.c:x264_cabac_size_decision2 Unexecuted instantiation: mvpred.c:x264_cabac_size_decision2 Unexecuted instantiation: analyse.c:x264_cabac_size_decision2 Unexecuted instantiation: me.c:x264_cabac_size_decision2 Unexecuted instantiation: ratecontrol.c:x264_cabac_size_decision2 Unexecuted instantiation: cavlc.c:x264_cabac_size_decision2 Unexecuted instantiation: rectangle.c:x264_cabac_size_decision2 |
114 | | |
115 | | static ALWAYS_INLINE void x264_cabac_size_decision_noup( x264_cabac_t *cb, long i_ctx, long b ) |
116 | 0 | { |
117 | 0 | int i_state = cb->state[i_ctx]; |
118 | 0 | cb->f8_bits_encoded += x264_cabac_entropy[i_state^b]; |
119 | 0 | } Unexecuted instantiation: bitstream.c:x264_cabac_size_decision_noup Unexecuted instantiation: encoder.c:x264_cabac_size_decision_noup Unexecuted instantiation: lookahead.c:x264_cabac_size_decision_noup Unexecuted instantiation: threadpool.c:x264_cabac_size_decision_noup Unexecuted instantiation: mc.c:x264_cabac_size_decision_noup Unexecuted instantiation: predict.c:x264_cabac_size_decision_noup Unexecuted instantiation: pixel.c:x264_cabac_size_decision_noup Unexecuted instantiation: macroblock.c:x264_cabac_size_decision_noup Unexecuted instantiation: frame.c:x264_cabac_size_decision_noup Unexecuted instantiation: dct.c:x264_cabac_size_decision_noup Unexecuted instantiation: cabac.c:x264_cabac_size_decision_noup Unexecuted instantiation: common.c:x264_cabac_size_decision_noup Unexecuted instantiation: set.c:x264_cabac_size_decision_noup Unexecuted instantiation: quant.c:x264_cabac_size_decision_noup Unexecuted instantiation: deblock.c:x264_cabac_size_decision_noup Unexecuted instantiation: vlc.c:x264_cabac_size_decision_noup Unexecuted instantiation: mvpred.c:x264_cabac_size_decision_noup Unexecuted instantiation: analyse.c:x264_cabac_size_decision_noup Unexecuted instantiation: me.c:x264_cabac_size_decision_noup Unexecuted instantiation: ratecontrol.c:x264_cabac_size_decision_noup Unexecuted instantiation: cavlc.c:x264_cabac_size_decision_noup Unexecuted instantiation: rectangle.c:x264_cabac_size_decision_noup |
120 | | |
121 | | static ALWAYS_INLINE int x264_cabac_size_decision_noup2( uint8_t *state, long b ) |
122 | 0 | { |
123 | 0 | return x264_cabac_entropy[*state^b]; |
124 | 0 | } Unexecuted instantiation: bitstream.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: encoder.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: lookahead.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: threadpool.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: mc.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: predict.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: pixel.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: macroblock.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: frame.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: dct.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: cabac.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: common.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: set.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: quant.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: deblock.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: vlc.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: mvpred.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: analyse.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: me.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: ratecontrol.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: cavlc.c:x264_cabac_size_decision_noup2 Unexecuted instantiation: rectangle.c:x264_cabac_size_decision_noup2 |
125 | | |
126 | | #endif |