/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 | } |