/src/libvpx/vp8/encoder/treewriter.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 | | * |
4 | | * Use of this source code is governed by a BSD-style license |
5 | | * that can be found in the LICENSE file in the root of the source |
6 | | * tree. An additional intellectual property rights grant can be found |
7 | | * in the file PATENTS. All contributing project authors may |
8 | | * be found in the AUTHORS file in the root of the source tree. |
9 | | */ |
10 | | |
11 | | #ifndef VPX_VP8_ENCODER_TREEWRITER_H_ |
12 | | #define VPX_VP8_ENCODER_TREEWRITER_H_ |
13 | | |
14 | | /* Trees map alphabets into huffman-like codes suitable for an arithmetic |
15 | | bit coder. Timothy S Murphy 11 October 2004 */ |
16 | | |
17 | | #include <stdint.h> |
18 | | |
19 | | #include "./vpx_config.h" |
20 | | #include "vp8/common/treecoder.h" |
21 | | |
22 | | #include "boolhuff.h" /* for now */ |
23 | | |
24 | | #ifdef __cplusplus |
25 | | extern "C" { |
26 | | #endif |
27 | | |
28 | | typedef BOOL_CODER vp8_writer; |
29 | | |
30 | 124M | #define vp8_write vp8_encode_bool |
31 | 2.39M | #define vp8_write_literal vp8_encode_value |
32 | 1.38M | #define vp8_write_bit(W, V) vp8_write(W, V, vp8_prob_half) |
33 | | |
34 | | #define vp8bc_write vp8bc_write_bool |
35 | | #define vp8bc_write_literal vp8bc_write_bits |
36 | | #define vp8bc_write_bit(W, V) vp8bc_write_bits(W, V, 1) |
37 | | |
38 | | /* Approximate length of an encoded bool in 256ths of a bit at given prob */ |
39 | | |
40 | 1.96G | #define vp8_cost_zero(x) (vp8_prob_cost[x]) |
41 | 598M | #define vp8_cost_one(x) vp8_cost_zero(vp8_complement(x)) |
42 | | |
43 | 810M | #define vp8_cost_bit(x, b) vp8_cost_zero((b) ? vp8_complement(x) : (x)) |
44 | | |
45 | | /* VP8BC version is scaled by 2^20 rather than 2^8; see bool_coder.h */ |
46 | | |
47 | | /* Both of these return bits, not scaled bits. */ |
48 | | |
49 | | static INLINE unsigned int vp8_cost_branch(const unsigned int ct[2], |
50 | 339M | vp8_prob p) { |
51 | | /* Imitate existing calculation */ |
52 | | |
53 | 339M | return (unsigned int)(((((uint64_t)ct[0]) * vp8_cost_zero(p)) + |
54 | 339M | (((uint64_t)ct[1]) * vp8_cost_one(p))) >> |
55 | 339M | 8); |
56 | 339M | } Unexecuted instantiation: vp8_cx_iface.c:vp8_cost_branch Unexecuted instantiation: ethreading.c:vp8_cost_branch Unexecuted instantiation: onyx_if.c:vp8_cost_branch Unexecuted instantiation: pickinter.c:vp8_cost_branch Unexecuted instantiation: picklpf.c:vp8_cost_branch Unexecuted instantiation: vp8_quantize.c:vp8_cost_branch Unexecuted instantiation: ratectrl.c:vp8_cost_branch Unexecuted instantiation: rdopt.c:vp8_cost_branch Unexecuted instantiation: segmentation.c:vp8_cost_branch Unexecuted instantiation: vp8_skin_detection.c:vp8_cost_branch Unexecuted instantiation: tokenize.c:vp8_cost_branch Unexecuted instantiation: treewriter.c:vp8_cost_branch Unexecuted instantiation: temporal_filter.c:vp8_cost_branch bitstream.c:vp8_cost_branch Line | Count | Source | 50 | 334M | vp8_prob p) { | 51 | | /* Imitate existing calculation */ | 52 | | | 53 | 334M | return (unsigned int)(((((uint64_t)ct[0]) * vp8_cost_zero(p)) + | 54 | 334M | (((uint64_t)ct[1]) * vp8_cost_one(p))) >> | 55 | 334M | 8); | 56 | 334M | } |
Unexecuted instantiation: encodeframe.c:vp8_cost_branch Unexecuted instantiation: encodeintra.c:vp8_cost_branch Unexecuted instantiation: encodemb.c:vp8_cost_branch encodemv.c:vp8_cost_branch Line | Count | Source | 50 | 4.39M | vp8_prob p) { | 51 | | /* Imitate existing calculation */ | 52 | | | 53 | 4.39M | return (unsigned int)(((((uint64_t)ct[0]) * vp8_cost_zero(p)) + | 54 | 4.39M | (((uint64_t)ct[1]) * vp8_cost_one(p))) >> | 55 | 4.39M | 8); | 56 | 4.39M | } |
Unexecuted instantiation: firstpass.c:vp8_cost_branch Unexecuted instantiation: mcomp.c:vp8_cost_branch Unexecuted instantiation: modecosts.c:vp8_cost_branch |
57 | | |
58 | | /* Small functions to write explicit values and tokens, as well as |
59 | | estimate their lengths. */ |
60 | | |
61 | | static void vp8_treed_write(vp8_writer *const w, vp8_tree t, |
62 | | const vp8_prob *const p, int v, |
63 | 14.7M | int n) { /* number of bits in v, assumed nonzero */ |
64 | 14.7M | vp8_tree_index i = 0; |
65 | | |
66 | 38.4M | do { |
67 | 38.4M | const int b = (v >> --n) & 1; |
68 | 38.4M | vp8_write(w, b, p[i >> 1]); |
69 | 38.4M | i = t[i + b]; |
70 | 38.4M | } while (n); |
71 | 14.7M | } Unexecuted instantiation: vp8_cx_iface.c:vp8_treed_write Unexecuted instantiation: ethreading.c:vp8_treed_write Unexecuted instantiation: onyx_if.c:vp8_treed_write Unexecuted instantiation: pickinter.c:vp8_treed_write Unexecuted instantiation: picklpf.c:vp8_treed_write Unexecuted instantiation: vp8_quantize.c:vp8_treed_write Unexecuted instantiation: ratectrl.c:vp8_treed_write Unexecuted instantiation: rdopt.c:vp8_treed_write Unexecuted instantiation: segmentation.c:vp8_treed_write Unexecuted instantiation: vp8_skin_detection.c:vp8_treed_write Unexecuted instantiation: tokenize.c:vp8_treed_write Unexecuted instantiation: treewriter.c:vp8_treed_write Unexecuted instantiation: temporal_filter.c:vp8_treed_write bitstream.c:vp8_treed_write Line | Count | Source | 63 | 14.4M | int n) { /* number of bits in v, assumed nonzero */ | 64 | 14.4M | vp8_tree_index i = 0; | 65 | | | 66 | 37.7M | do { | 67 | 37.7M | const int b = (v >> --n) & 1; | 68 | 37.7M | vp8_write(w, b, p[i >> 1]); | 69 | 37.7M | i = t[i + b]; | 70 | 37.7M | } while (n); | 71 | 14.4M | } |
Unexecuted instantiation: encodeframe.c:vp8_treed_write Unexecuted instantiation: encodeintra.c:vp8_treed_write Unexecuted instantiation: encodemb.c:vp8_treed_write encodemv.c:vp8_treed_write Line | Count | Source | 63 | 220k | int n) { /* number of bits in v, assumed nonzero */ | 64 | 220k | vp8_tree_index i = 0; | 65 | | | 66 | 662k | do { | 67 | 662k | const int b = (v >> --n) & 1; | 68 | 662k | vp8_write(w, b, p[i >> 1]); | 69 | 662k | i = t[i + b]; | 70 | 662k | } while (n); | 71 | 220k | } |
Unexecuted instantiation: firstpass.c:vp8_treed_write Unexecuted instantiation: mcomp.c:vp8_treed_write Unexecuted instantiation: modecosts.c:vp8_treed_write |
72 | | static INLINE void vp8_write_token(vp8_writer *const w, vp8_tree t, |
73 | | const vp8_prob *const p, |
74 | 14.4M | vp8_token *const x) { |
75 | 14.4M | vp8_treed_write(w, t, p, x->value, x->Len); |
76 | 14.4M | } Unexecuted instantiation: vp8_cx_iface.c:vp8_write_token Unexecuted instantiation: ethreading.c:vp8_write_token Unexecuted instantiation: onyx_if.c:vp8_write_token Unexecuted instantiation: pickinter.c:vp8_write_token Unexecuted instantiation: picklpf.c:vp8_write_token Unexecuted instantiation: vp8_quantize.c:vp8_write_token Unexecuted instantiation: ratectrl.c:vp8_write_token Unexecuted instantiation: rdopt.c:vp8_write_token Unexecuted instantiation: segmentation.c:vp8_write_token Unexecuted instantiation: vp8_skin_detection.c:vp8_write_token Unexecuted instantiation: tokenize.c:vp8_write_token Unexecuted instantiation: treewriter.c:vp8_write_token Unexecuted instantiation: temporal_filter.c:vp8_write_token bitstream.c:vp8_write_token Line | Count | Source | 74 | 14.4M | vp8_token *const x) { | 75 | 14.4M | vp8_treed_write(w, t, p, x->value, x->Len); | 76 | 14.4M | } |
Unexecuted instantiation: encodeframe.c:vp8_write_token Unexecuted instantiation: encodeintra.c:vp8_write_token Unexecuted instantiation: encodemb.c:vp8_write_token Unexecuted instantiation: encodemv.c:vp8_write_token Unexecuted instantiation: firstpass.c:vp8_write_token Unexecuted instantiation: mcomp.c:vp8_write_token Unexecuted instantiation: modecosts.c:vp8_write_token |
77 | | |
78 | | static int vp8_treed_cost(vp8_tree t, const vp8_prob *const p, int v, |
79 | 6.99M | int n) { /* number of bits in v, assumed nonzero */ |
80 | 6.99M | int c = 0; |
81 | 6.99M | vp8_tree_index i = 0; |
82 | | |
83 | 18.0M | do { |
84 | 18.0M | const int b = (v >> --n) & 1; |
85 | 18.0M | c += vp8_cost_bit(p[i >> 1], b); |
86 | 18.0M | i = t[i + b]; |
87 | 18.0M | } while (n); |
88 | | |
89 | 6.99M | return c; |
90 | 6.99M | } Unexecuted instantiation: vp8_cx_iface.c:vp8_treed_cost Unexecuted instantiation: ethreading.c:vp8_treed_cost Unexecuted instantiation: onyx_if.c:vp8_treed_cost Unexecuted instantiation: pickinter.c:vp8_treed_cost Unexecuted instantiation: picklpf.c:vp8_treed_cost Unexecuted instantiation: vp8_quantize.c:vp8_treed_cost Unexecuted instantiation: ratectrl.c:vp8_treed_cost Line | Count | Source | 79 | 6.64M | int n) { /* number of bits in v, assumed nonzero */ | 80 | 6.64M | int c = 0; | 81 | 6.64M | vp8_tree_index i = 0; | 82 | | | 83 | 16.9M | do { | 84 | 16.9M | const int b = (v >> --n) & 1; | 85 | 16.9M | c += vp8_cost_bit(p[i >> 1], b); | 86 | 16.9M | i = t[i + b]; | 87 | 16.9M | } while (n); | 88 | | | 89 | 6.64M | return c; | 90 | 6.64M | } |
Unexecuted instantiation: segmentation.c:vp8_treed_cost Unexecuted instantiation: vp8_skin_detection.c:vp8_treed_cost Unexecuted instantiation: tokenize.c:vp8_treed_cost Unexecuted instantiation: treewriter.c:vp8_treed_cost Unexecuted instantiation: temporal_filter.c:vp8_treed_cost Unexecuted instantiation: bitstream.c:vp8_treed_cost Unexecuted instantiation: encodeframe.c:vp8_treed_cost Unexecuted instantiation: encodeintra.c:vp8_treed_cost Unexecuted instantiation: encodemb.c:vp8_treed_cost encodemv.c:vp8_treed_cost Line | Count | Source | 79 | 348k | int n) { /* number of bits in v, assumed nonzero */ | 80 | 348k | int c = 0; | 81 | 348k | vp8_tree_index i = 0; | 82 | | | 83 | 1.04M | do { | 84 | 1.04M | const int b = (v >> --n) & 1; | 85 | 1.04M | c += vp8_cost_bit(p[i >> 1], b); | 86 | 1.04M | i = t[i + b]; | 87 | 1.04M | } while (n); | 88 | | | 89 | 348k | return c; | 90 | 348k | } |
Unexecuted instantiation: firstpass.c:vp8_treed_cost Unexecuted instantiation: mcomp.c:vp8_treed_cost Unexecuted instantiation: modecosts.c:vp8_treed_cost |
91 | | static INLINE int vp8_cost_token(vp8_tree t, const vp8_prob *const p, |
92 | 6.64M | vp8_token *const x) { |
93 | 6.64M | return vp8_treed_cost(t, p, x->value, x->Len); |
94 | 6.64M | } Unexecuted instantiation: vp8_cx_iface.c:vp8_cost_token Unexecuted instantiation: ethreading.c:vp8_cost_token Unexecuted instantiation: onyx_if.c:vp8_cost_token Unexecuted instantiation: pickinter.c:vp8_cost_token Unexecuted instantiation: picklpf.c:vp8_cost_token Unexecuted instantiation: vp8_quantize.c:vp8_cost_token Unexecuted instantiation: ratectrl.c:vp8_cost_token Line | Count | Source | 92 | 6.64M | vp8_token *const x) { | 93 | 6.64M | return vp8_treed_cost(t, p, x->value, x->Len); | 94 | 6.64M | } |
Unexecuted instantiation: segmentation.c:vp8_cost_token Unexecuted instantiation: vp8_skin_detection.c:vp8_cost_token Unexecuted instantiation: tokenize.c:vp8_cost_token Unexecuted instantiation: treewriter.c:vp8_cost_token Unexecuted instantiation: temporal_filter.c:vp8_cost_token Unexecuted instantiation: bitstream.c:vp8_cost_token Unexecuted instantiation: encodeframe.c:vp8_cost_token Unexecuted instantiation: encodeintra.c:vp8_cost_token Unexecuted instantiation: encodemb.c:vp8_cost_token Unexecuted instantiation: encodemv.c:vp8_cost_token Unexecuted instantiation: firstpass.c:vp8_cost_token Unexecuted instantiation: mcomp.c:vp8_cost_token Unexecuted instantiation: modecosts.c:vp8_cost_token |
95 | | |
96 | | /* Fill array of costs for all possible token values. */ |
97 | | |
98 | | void vp8_cost_tokens(int *c, const vp8_prob *, vp8_tree); |
99 | | |
100 | | void vp8_cost_tokens2(int *c, const vp8_prob *, vp8_tree, int); |
101 | | |
102 | | #ifdef __cplusplus |
103 | | } // extern "C" |
104 | | #endif |
105 | | |
106 | | #endif // VPX_VP8_ENCODER_TREEWRITER_H_ |