Coverage Report

Created: 2026-02-14 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/vp9prob.c
Line
Count
Source
1
/*
2
 * VP9 compatible video decoder
3
 *
4
 * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
5
 * Copyright (C) 2013 Clément Bœsch <u pkh me>
6
 *
7
 * This file is part of FFmpeg.
8
 *
9
 * FFmpeg is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public
11
 * License as published by the Free Software Foundation; either
12
 * version 2.1 of the License, or (at your option) any later version.
13
 *
14
 * FFmpeg 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 GNU
17
 * Lesser General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public
20
 * License along with FFmpeg; if not, write to the Free Software
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
 */
23
24
#include "vp9.h"
25
#include "vp9dec.h"
26
27
static av_always_inline void adapt_prob(uint8_t *p, unsigned ct0, unsigned ct1,
28
                                        int max_count, int update_factor)
29
332M
{
30
332M
    unsigned ct = ct0 + ct1, p2, p1;
31
32
332M
    if (!ct)
33
301M
        return;
34
35
30.9M
    update_factor = FASTDIV(update_factor * FFMIN(ct, max_count), max_count);
36
30.9M
    p1 = *p;
37
30.9M
    p2 = ((((int64_t) ct0) << 8) + (ct >> 1)) / ct;
38
30.9M
    p2 = av_clip(p2, 1, 255);
39
40
    // (p1 * (256 - update_factor) + p2 * update_factor + 128) >> 8
41
30.9M
    *p = p1 + (((p2 - p1) * update_factor + 128) >> 8);
42
30.9M
}
43
44
void ff_vp9_adapt_probs(VP9Context *s)
45
177k
{
46
177k
    int i, j, k, l, m;
47
177k
    ProbContext *p = &s->prob_ctx[s->s.h.framectxid].p;
48
177k
    int uf = (s->s.h.keyframe || s->s.h.intraonly || !s->last_keyframe) ? 112 : 128;
49
50
    // coefficients
51
889k
    for (i = 0; i < 4; i++)
52
2.13M
        for (j = 0; j < 2; j++)
53
4.26M
            for (k = 0; k < 2; k++)
54
19.9M
                for (l = 0; l < 6; l++)
55
110M
                    for (m = 0; m < 6; m++) {
56
96.7M
                        uint8_t *pp = s->prob_ctx[s->s.h.framectxid].coef[i][j][k][l][m];
57
96.7M
                        unsigned *e = s->td[0].counts.eob[i][j][k][l][m];
58
96.7M
                        unsigned *c = s->td[0].counts.coef[i][j][k][l][m];
59
60
96.7M
                        if (l == 0 && m >= 3) // dc only has 3 pt
61
2.84M
                            break;
62
63
93.9M
                        adapt_prob(&pp[0], e[0], e[1], 24, uf);
64
93.9M
                        adapt_prob(&pp[1], c[0], c[1] + c[2], 24, uf);
65
93.9M
                        adapt_prob(&pp[2], c[1], c[2], 24, uf);
66
93.9M
                    }
67
68
177k
    if (s->s.h.keyframe || s->s.h.intraonly) {
69
134
        memcpy(p->skip,  s->prob.p.skip,  sizeof(p->skip));
70
134
        memcpy(p->tx32p, s->prob.p.tx32p, sizeof(p->tx32p));
71
134
        memcpy(p->tx16p, s->prob.p.tx16p, sizeof(p->tx16p));
72
134
        memcpy(p->tx8p,  s->prob.p.tx8p,  sizeof(p->tx8p));
73
134
        return;
74
134
    }
75
76
    // skip flag
77
710k
    for (i = 0; i < 3; i++)
78
533k
        adapt_prob(&p->skip[i], s->td[0].counts.skip[i][0],
79
533k
                   s->td[0].counts.skip[i][1], 20, 128);
80
81
    // intra/inter flag
82
888k
    for (i = 0; i < 4; i++)
83
710k
        adapt_prob(&p->intra[i], s->td[0].counts.intra[i][0],
84
710k
                   s->td[0].counts.intra[i][1], 20, 128);
85
86
    // comppred flag
87
177k
    if (s->s.h.comppredmode == PRED_SWITCHABLE) {
88
364k
        for (i = 0; i < 5; i++)
89
303k
            adapt_prob(&p->comp[i], s->td[0].counts.comp[i][0],
90
303k
                       s->td[0].counts.comp[i][1], 20, 128);
91
60.7k
    }
92
93
    // reference frames
94
177k
    if (s->s.h.comppredmode != PRED_SINGLEREF) {
95
823k
        for (i = 0; i < 5; i++)
96
686k
            adapt_prob(&p->comp_ref[i], s->td[0].counts.comp_ref[i][0],
97
686k
                       s->td[0].counts.comp_ref[i][1], 20, 128);
98
137k
    }
99
100
177k
    if (s->s.h.comppredmode != PRED_COMPREF) {
101
607k
        for (i = 0; i < 5; i++) {
102
506k
            uint8_t *pp = p->single_ref[i];
103
506k
            unsigned (*c)[2] = s->td[0].counts.single_ref[i];
104
105
506k
            adapt_prob(&pp[0], c[0][0], c[0][1], 20, 128);
106
506k
            adapt_prob(&pp[1], c[1][0], c[1][1], 20, 128);
107
506k
        }
108
101k
    }
109
110
    // block partitioning
111
888k
    for (i = 0; i < 4; i++)
112
3.55M
        for (j = 0; j < 4; j++) {
113
2.84M
            uint8_t *pp = p->partition[i][j];
114
2.84M
            unsigned *c = s->td[0].counts.partition[i][j];
115
116
2.84M
            adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
117
2.84M
            adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
118
2.84M
            adapt_prob(&pp[2], c[2], c[3], 20, 128);
119
2.84M
        }
120
121
    // tx size
122
177k
    if (s->s.h.txfmmode == TX_SWITCHABLE) {
123
126k
        for (i = 0; i < 2; i++) {
124
84.1k
            unsigned *c16 = s->td[0].counts.tx16p[i], *c32 = s->td[0].counts.tx32p[i];
125
126
84.1k
            adapt_prob(&p->tx8p[i], s->td[0].counts.tx8p[i][0],
127
84.1k
                       s->td[0].counts.tx8p[i][1], 20, 128);
128
84.1k
            adapt_prob(&p->tx16p[i][0], c16[0], c16[1] + c16[2], 20, 128);
129
84.1k
            adapt_prob(&p->tx16p[i][1], c16[1], c16[2], 20, 128);
130
84.1k
            adapt_prob(&p->tx32p[i][0], c32[0], c32[1] + c32[2] + c32[3], 20, 128);
131
84.1k
            adapt_prob(&p->tx32p[i][1], c32[1], c32[2] + c32[3], 20, 128);
132
84.1k
            adapt_prob(&p->tx32p[i][2], c32[2], c32[3], 20, 128);
133
84.1k
        }
134
42.0k
    }
135
136
    // interpolation filter
137
177k
    if (s->s.h.filtermode == FILTER_SWITCHABLE) {
138
236k
        for (i = 0; i < 4; i++) {
139
189k
            uint8_t *pp = p->filter[i];
140
189k
            unsigned *c = s->td[0].counts.filter[i];
141
142
189k
            adapt_prob(&pp[0], c[0], c[1] + c[2], 20, 128);
143
189k
            adapt_prob(&pp[1], c[1], c[2], 20, 128);
144
189k
        }
145
47.2k
    }
146
147
    // inter modes
148
1.42M
    for (i = 0; i < 7; i++) {
149
1.24M
        uint8_t *pp = p->mv_mode[i];
150
1.24M
        unsigned *c = s->td[0].counts.mv_mode[i];
151
152
1.24M
        adapt_prob(&pp[0], c[2], c[1] + c[0] + c[3], 20, 128);
153
1.24M
        adapt_prob(&pp[1], c[0], c[1] + c[3], 20, 128);
154
1.24M
        adapt_prob(&pp[2], c[1], c[3], 20, 128);
155
1.24M
    }
156
157
    // mv joints
158
177k
    {
159
177k
        uint8_t *pp = p->mv_joint;
160
177k
        unsigned *c = s->td[0].counts.mv_joint;
161
162
177k
        adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
163
177k
        adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
164
177k
        adapt_prob(&pp[2], c[2], c[3], 20, 128);
165
177k
    }
166
167
    // mv components
168
533k
    for (i = 0; i < 2; i++) {
169
355k
        uint8_t *pp;
170
355k
        unsigned *c, (*c2)[2], sum;
171
172
355k
        adapt_prob(&p->mv_comp[i].sign, s->td[0].counts.mv_comp[i].sign[0],
173
355k
                   s->td[0].counts.mv_comp[i].sign[1], 20, 128);
174
175
355k
        pp  = p->mv_comp[i].classes;
176
355k
        c   = s->td[0].counts.mv_comp[i].classes;
177
355k
        sum = c[1] + c[2] + c[3] + c[4] + c[5] +
178
355k
              c[6] + c[7] + c[8] + c[9] + c[10];
179
355k
        adapt_prob(&pp[0], c[0], sum, 20, 128);
180
355k
        sum -= c[1];
181
355k
        adapt_prob(&pp[1], c[1], sum, 20, 128);
182
355k
        sum -= c[2] + c[3];
183
355k
        adapt_prob(&pp[2], c[2] + c[3], sum, 20, 128);
184
355k
        adapt_prob(&pp[3], c[2], c[3], 20, 128);
185
355k
        sum -= c[4] + c[5];
186
355k
        adapt_prob(&pp[4], c[4] + c[5], sum, 20, 128);
187
355k
        adapt_prob(&pp[5], c[4], c[5], 20, 128);
188
355k
        sum -= c[6];
189
355k
        adapt_prob(&pp[6], c[6], sum, 20, 128);
190
355k
        adapt_prob(&pp[7], c[7] + c[8], c[9] + c[10], 20, 128);
191
355k
        adapt_prob(&pp[8], c[7], c[8], 20, 128);
192
355k
        adapt_prob(&pp[9], c[9], c[10], 20, 128);
193
194
355k
        adapt_prob(&p->mv_comp[i].class0, s->td[0].counts.mv_comp[i].class0[0],
195
355k
                   s->td[0].counts.mv_comp[i].class0[1], 20, 128);
196
355k
        pp = p->mv_comp[i].bits;
197
355k
        c2 = s->td[0].counts.mv_comp[i].bits;
198
3.91M
        for (j = 0; j < 10; j++)
199
3.55M
            adapt_prob(&pp[j], c2[j][0], c2[j][1], 20, 128);
200
201
1.06M
        for (j = 0; j < 2; j++) {
202
710k
            pp = p->mv_comp[i].class0_fp[j];
203
710k
            c  = s->td[0].counts.mv_comp[i].class0_fp[j];
204
710k
            adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
205
710k
            adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
206
710k
            adapt_prob(&pp[2], c[2], c[3], 20, 128);
207
710k
        }
208
355k
        pp = p->mv_comp[i].fp;
209
355k
        c  = s->td[0].counts.mv_comp[i].fp;
210
355k
        adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
211
355k
        adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
212
355k
        adapt_prob(&pp[2], c[2], c[3], 20, 128);
213
214
355k
        if (s->s.h.highprecisionmvs) {
215
247k
            adapt_prob(&p->mv_comp[i].class0_hp,
216
247k
                       s->td[0].counts.mv_comp[i].class0_hp[0],
217
247k
                       s->td[0].counts.mv_comp[i].class0_hp[1], 20, 128);
218
247k
            adapt_prob(&p->mv_comp[i].hp, s->td[0].counts.mv_comp[i].hp[0],
219
247k
                       s->td[0].counts.mv_comp[i].hp[1], 20, 128);
220
247k
        }
221
355k
    }
222
223
    // y intra modes
224
888k
    for (i = 0; i < 4; i++) {
225
710k
        uint8_t *pp = p->y_mode[i];
226
710k
        unsigned *c = s->td[0].counts.y_mode[i], sum, s2;
227
228
710k
        sum = c[0] + c[1] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9];
229
710k
        adapt_prob(&pp[0], c[DC_PRED], sum, 20, 128);
230
710k
        sum -= c[TM_VP8_PRED];
231
710k
        adapt_prob(&pp[1], c[TM_VP8_PRED], sum, 20, 128);
232
710k
        sum -= c[VERT_PRED];
233
710k
        adapt_prob(&pp[2], c[VERT_PRED], sum, 20, 128);
234
710k
        s2   = c[HOR_PRED] + c[DIAG_DOWN_RIGHT_PRED] + c[VERT_RIGHT_PRED];
235
710k
        sum -= s2;
236
710k
        adapt_prob(&pp[3], s2, sum, 20, 128);
237
710k
        s2 -= c[HOR_PRED];
238
710k
        adapt_prob(&pp[4], c[HOR_PRED], s2, 20, 128);
239
710k
        adapt_prob(&pp[5], c[DIAG_DOWN_RIGHT_PRED], c[VERT_RIGHT_PRED],
240
710k
                   20, 128);
241
710k
        sum -= c[DIAG_DOWN_LEFT_PRED];
242
710k
        adapt_prob(&pp[6], c[DIAG_DOWN_LEFT_PRED], sum, 20, 128);
243
710k
        sum -= c[VERT_LEFT_PRED];
244
710k
        adapt_prob(&pp[7], c[VERT_LEFT_PRED], sum, 20, 128);
245
710k
        adapt_prob(&pp[8], c[HOR_DOWN_PRED], c[HOR_UP_PRED], 20, 128);
246
710k
    }
247
248
    // uv intra modes
249
1.95M
    for (i = 0; i < 10; i++) {
250
1.77M
        uint8_t *pp = p->uv_mode[i];
251
1.77M
        unsigned *c = s->td[0].counts.uv_mode[i], sum, s2;
252
253
1.77M
        sum = c[0] + c[1] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9];
254
1.77M
        adapt_prob(&pp[0], c[DC_PRED], sum, 20, 128);
255
1.77M
        sum -= c[TM_VP8_PRED];
256
1.77M
        adapt_prob(&pp[1], c[TM_VP8_PRED], sum, 20, 128);
257
1.77M
        sum -= c[VERT_PRED];
258
1.77M
        adapt_prob(&pp[2], c[VERT_PRED], sum, 20, 128);
259
1.77M
        s2   = c[HOR_PRED] + c[DIAG_DOWN_RIGHT_PRED] + c[VERT_RIGHT_PRED];
260
1.77M
        sum -= s2;
261
1.77M
        adapt_prob(&pp[3], s2, sum, 20, 128);
262
1.77M
        s2 -= c[HOR_PRED];
263
1.77M
        adapt_prob(&pp[4], c[HOR_PRED], s2, 20, 128);
264
1.77M
        adapt_prob(&pp[5], c[DIAG_DOWN_RIGHT_PRED], c[VERT_RIGHT_PRED],
265
1.77M
                   20, 128);
266
1.77M
        sum -= c[DIAG_DOWN_LEFT_PRED];
267
1.77M
        adapt_prob(&pp[6], c[DIAG_DOWN_LEFT_PRED], sum, 20, 128);
268
1.77M
        sum -= c[VERT_LEFT_PRED];
269
1.77M
        adapt_prob(&pp[7], c[VERT_LEFT_PRED], sum, 20, 128);
270
1.77M
        adapt_prob(&pp[8], c[HOR_DOWN_PRED], c[HOR_UP_PRED], 20, 128);
271
1.77M
    }
272
177k
}