Go to the documentation of this file.
104 int size,
int max_length)
110 int nbits[257] = {0};
119 from->item_idx[0] = 0;
122 for (times = 0; times <= max_length; times++) {
129 if (times < max_length) {
132 while (
i <
size || j + 1 <
from->nitems) {
134 to->item_idx[
to->nitems] =
to->item_idx[
to->nitems - 1];
136 (j + 1 >=
from->nitems ||
138 from->probability[j] +
from->probability[j + 1])) {
139 to->items[
to->item_idx[
to->nitems]++] = prob_table[
i].
value;
140 to->probability[
to->nitems - 1] = prob_table[
i].
prob;
143 for (k =
from->item_idx[j]; k < from->item_idx[j + 2]; k++) {
144 to->items[
to->item_idx[
to->nitems]++] =
from->items[k];
146 to->probability[
to->nitems - 1] =
147 from->probability[j] +
from->probability[j + 1];
158 nbits[
from->items[
i]]++;
163 for (
i = 0;
i < 256;
i++) {
165 distincts[j].
code =
i;
166 distincts[j].
length = nbits[
i];
174 memset(
s->val_count, 0,
sizeof(
s->val_count));
186 uint8_t
val[],
int max_nval)
194 for (
int i = 0;
i < 256;
i++) {
195 if (
s->val_count[
i]) {
196 val_counts[nval].
value =
i;
197 val_counts[nval].
prob =
s->val_count[
i];
202 val_counts[nval].
value = 256;
203 val_counts[nval].
prob = 0;
207 memset(
bits, 0,
sizeof(
bits[0]) * 17);
208 for (
int i = 0;
i < nval;
i++) {
void ff_mjpeg_encode_huffman_close(MJpegEncHuffmanContext *s, uint8_t bits[17], uint8_t val[], int max_nval)
Produces a Huffman encoding with a given input.
static void mjpegenc_huffman_compute_bits(PTable *prob_table, HuffTable *distincts, int size, int max_length)
Computes the length of the Huffman encoding for each distinct input value.
int item_idx[515]
index range for each item in items 0, 2, 5, 9, 13
void ff_mjpeg_encode_huffman_init(MJpegEncHuffmanContext *s)
static int compare_by_prob(const void *a, const void *b)
Comparison function for two PTables by prob.
int prob
number of occurences of this value in input
static double val(void *priv, double ch)
#define FF_ARRAY_ELEMS(a)
static int compare_by_length(const void *a, const void *b)
Comparison function for two HuffTables by length.
int nitems
number of items in the list and probability ex. 4
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int64_t prob
number of occurences of this value in input
Used to assign a occurrence count or "probability" to an input value.
Used to store optimal huffman encoding results.
int code
code is the input value
Used to store intermediate lists in the package merge algorithm.
int length
length of the encoding
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define i(width, name, range_min, range_max)
#define AV_QSORT(p, num, type, cmp)
Quicksort This sort is fast, and fully inplace but not stable and it is possible to construct input t...
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
int items[257 *16]
chain of all individual values that make up items A, B, A, B, C, A, B, C, D, C, D,...
int probability[514]
probability of each item 3, 8, 18, 46