FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/snow.c
Date: 2026-09-24 20:08:24
Exec Total Coverage
Lines: 385 405 95.1%
Functions: 33 36 91.7%
Branches: 183 210 87.1%

Line Branch Exec Source
1 /*
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <assert.h>
22
23 #include "libavutil/avassert.h"
24 #include "libavutil/log.h"
25 #include "libavutil/mem.h"
26 #include "libavutil/thread.h"
27 #include "avcodec.h"
28 #include "snow_dwt.h"
29 #include "snow.h"
30 #include "snowdata.h"
31
32 #define pixeltmp int16_t
33 #define BIT_DEPTH 8
34 #define SNOW
35 #include "h264qpel_template.c"
36
37 58660 static void put_snow_qpel2_h_lowpass_8(uint8_t *dst, const uint8_t *restrict src, int dstStride, int srcStride)
38 {
39 58660 const int h = 2;
40
2/2
✓ Branch 0 taken 117320 times.
✓ Branch 1 taken 58660 times.
175980 for (int i = 0; i < h; ++i) {
41 117320 dst[0] = av_clip_uint8(((src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]) + 16) >> 5);
42 117320 dst[1] = av_clip_uint8(((src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]) + 16) >> 5);
43 117320 dst += dstStride;
44 117320 src += srcStride;
45 }
46 58660 }
47
48 65508 static void put_snow_qpel2_v_lowpass_8(uint8_t *dst, const uint8_t *restrict src, int dstStride, int srcStride)
49 {
50 65508 const int w = 2;
51
2/2
✓ Branch 0 taken 131016 times.
✓ Branch 1 taken 65508 times.
196524 for (int i = 0; i < w; ++i) {
52 131016 const int srcB = src[-2*srcStride];
53 131016 const int srcA = src[-1*srcStride];
54 131016 const int src0 = src[0 *srcStride];
55 131016 const int src1 = src[1 *srcStride];
56 131016 const int src2 = src[2 *srcStride];
57 131016 const int src3 = src[3 *srcStride];
58 131016 const int src4 = src[4 *srcStride];
59 131016 dst[0*dstStride] = av_clip_uint8(((src0+src1)*20 - (srcA+src2)*5 + (srcB+src3) + 16) >> 5);
60 131016 dst[1*dstStride] = av_clip_uint8(((src1+src2)*20 - (src0+src3)*5 + (srcA+src4) + 16) >> 5);
61 131016 dst++;
62 131016 src++;
63 }
64 65508 }
65
66 59440 static void put_snow_qpel2_hv_lowpass_8(uint8_t *dst, pixeltmp *tmp, const uint8_t *restrict src, int dstStride, int tmpStride, int srcStride)
67 {
68 59440 const int h = 2;
69 59440 const int w = 2;
70 59440 src -= 2*srcStride;
71
2/2
✓ Branch 0 taken 416080 times.
✓ Branch 1 taken 59440 times.
475520 for (int i = 0; i < h + 5; ++i) {
72 416080 tmp[0] = (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);
73 416080 tmp[1] = (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);
74 416080 tmp += tmpStride;
75 416080 src += srcStride;
76 }
77 59440 tmp -= tmpStride*(h+5-2);
78
2/2
✓ Branch 0 taken 118880 times.
✓ Branch 1 taken 59440 times.
178320 for (int i = 0; i < w; ++i) {
79 118880 const int tmpB = tmp[-2*tmpStride];
80 118880 const int tmpA = tmp[-1*tmpStride];
81 118880 const int tmp0 = tmp[0 *tmpStride];
82 118880 const int tmp1 = tmp[1 *tmpStride];
83 118880 const int tmp2 = tmp[2 *tmpStride];
84 118880 const int tmp3 = tmp[3 *tmpStride];
85 118880 const int tmp4 = tmp[4 *tmpStride];
86 118880 dst[0*dstStride] = av_clip_uint8(((tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3) + 512) >> 10);
87 118880 dst[1*dstStride] = av_clip_uint8(((tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4) + 512) >> 10);
88 118880 dst++;
89 118880 tmp++;
90 }
91 59440 }
92
93 391516 H264_QPEL(put_, snow, 2)
94
95 33 static av_cold void init_qpel(SnowContext *const s)
96 {
97 static_assert(offsetof(H264QpelContext, put_h264_qpel_pixels_tab) == 0,
98 "put_h264_qpel_pixels_tab not at start of H264QpelContext");
99 33 ff_h264qpel_init(&s->h264qpel, 8);
100 33 s->put_snow_qpel_pixels_tab[3][0] = put_snow_qpel2_mc00_8_c;
101 33 s->put_snow_qpel_pixels_tab[3][1] = put_snow_qpel2_mc10_8_c;
102 33 s->put_snow_qpel_pixels_tab[3][2] = put_snow_qpel2_mc20_8_c;
103 33 s->put_snow_qpel_pixels_tab[3][3] = put_snow_qpel2_mc30_8_c;
104 33 s->put_snow_qpel_pixels_tab[3][4] = put_snow_qpel2_mc01_8_c;
105 33 s->put_snow_qpel_pixels_tab[3][5] = put_snow_qpel2_mc11_8_c;
106 33 s->put_snow_qpel_pixels_tab[3][6] = put_snow_qpel2_mc21_8_c;
107 33 s->put_snow_qpel_pixels_tab[3][7] = put_snow_qpel2_mc31_8_c;
108 33 s->put_snow_qpel_pixels_tab[3][8] = put_snow_qpel2_mc02_8_c;
109 33 s->put_snow_qpel_pixels_tab[3][9] = put_snow_qpel2_mc12_8_c;
110 33 s->put_snow_qpel_pixels_tab[3][10] = put_snow_qpel2_mc22_8_c;
111 33 s->put_snow_qpel_pixels_tab[3][11] = put_snow_qpel2_mc32_8_c;
112 33 s->put_snow_qpel_pixels_tab[3][12] = put_snow_qpel2_mc03_8_c;
113 33 s->put_snow_qpel_pixels_tab[3][13] = put_snow_qpel2_mc13_8_c;
114 33 s->put_snow_qpel_pixels_tab[3][14] = put_snow_qpel2_mc23_8_c;
115 33 s->put_snow_qpel_pixels_tab[3][15] = put_snow_qpel2_mc33_8_c;
116 33 }
117
118 710819 void ff_snow_inner_add_yblock_c(const uint8_t *obmc, const int obmc_stride, uint8_t **block, int b_w, int b_h,
119 int src_x, int src_stride, IDWTELEM *const *lines, int add, uint8_t *dst8)
120 {
121 int y, x;
122
123
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 710819 times.
710819 av_assume(add); // add == 0 is currently unused
124
125
2/2
✓ Branch 0 taken 3810552 times.
✓ Branch 1 taken 710819 times.
4521371 for(y=0; y<b_h; y++){
126 //FIXME ugly misuse of obmc_stride
127 3810552 const uint8_t *obmc1= obmc + y*obmc_stride;
128 3810552 const uint8_t *obmc2= obmc1+ (obmc_stride>>1);
129 3810552 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
130 3810552 const uint8_t *obmc4= obmc3+ (obmc_stride>>1);
131 3810552 IDWTELEM *dst = lines[y];
132 av_assert2(dst);
133
134
2/2
✓ Branch 0 taken 23848820 times.
✓ Branch 1 taken 3810552 times.
27659372 for(x=0; x<b_w; x++){
135 23848820 int v= obmc1[x] * block[3][x + y*src_stride]
136 23848820 +obmc2[x] * block[2][x + y*src_stride]
137 23848820 +obmc3[x] * block[1][x + y*src_stride]
138 23848820 +obmc4[x] * block[0][x + y*src_stride];
139
140 #if FRAC_BITS > LOG2_OBMC_MAX
141 v <<= FRAC_BITS - LOG2_OBMC_MAX;
142 #elif FRAC_BITS < LOG2_OBMC_MAX
143 23848820 v >>= LOG2_OBMC_MAX - FRAC_BITS;
144 #endif
145
1/2
✓ Branch 0 taken 23848820 times.
✗ Branch 1 not taken.
23848820 if(add){
146 23848820 v += dst[x + src_x];
147 23848820 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
148
2/2
✓ Branch 0 taken 3276 times.
✓ Branch 1 taken 23845544 times.
23848820 if(v&(~255)) v= ~(v>>31);
149 23848820 dst8[x + y*src_stride] = v;
150 }else{
151 ✗ dst[x + src_x] -= v;
152 }
153 }
154 }
155 710819 }
156
157 105 void ff_snow_reset_contexts(SnowContext *s){ //FIXME better initial contexts
158 int plane_index, level, orientation;
159
160
2/2
✓ Branch 0 taken 315 times.
✓ Branch 1 taken 105 times.
420 for(plane_index=0; plane_index<3; plane_index++){
161
2/2
✓ Branch 0 taken 2520 times.
✓ Branch 1 taken 315 times.
2835 for(level=0; level<MAX_DECOMPOSITIONS; level++){
162
2/2
✓ Branch 0 taken 7875 times.
✓ Branch 1 taken 2520 times.
10395 for(orientation=level ? 1:0; orientation<4; orientation++){
163 7875 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
164 }
165 }
166 }
167 105 memset(s->header_state, MID_STATE, sizeof(s->header_state));
168 105 memset(s->block_state, MID_STATE, sizeof(s->block_state));
169 105 }
170
171 474 int ff_snow_alloc_blocks(SnowContext *s){
172 474 int w= AV_CEIL_RSHIFT(s->avctx->width, LOG2_MB_SIZE);
173 474 int h= AV_CEIL_RSHIFT(s->avctx->height, LOG2_MB_SIZE);
174
175 474 s->b_width = w;
176 474 s->b_height= h;
177
178 474 av_free(s->block);
179 474 s->block = av_calloc(w * h, sizeof(*s->block) << (s->block_max_depth*2));
180
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 474 times.
474 if (!s->block)
181 ✗ return AVERROR(ENOMEM);
182
183 474 return 0;
184 }
185
186 3241119 static void mc_block(Plane *p, uint8_t *dst, const uint8_t *src, int stride, int b_w, int b_h, int dx, int dy){
187 static const uint8_t weight[64]={
188 8,7,6,5,4,3,2,1,
189 7,7,0,0,0,0,0,1,
190 6,0,6,0,0,0,2,0,
191 5,0,0,5,0,3,0,0,
192 4,0,0,0,4,0,0,0,
193 3,0,0,5,0,3,0,0,
194 2,0,6,0,0,0,2,0,
195 1,7,0,0,0,0,0,1,
196 };
197
198 static const uint8_t brane[256]={
199 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
200 0x04,0x05,0xcc,0xcc,0xcc,0xcc,0xcc,0x41,0x15,0x16,0xcc,0xcc,0xcc,0xcc,0xcc,0x52,
201 0x04,0xcc,0x05,0xcc,0xcc,0xcc,0x41,0xcc,0x15,0xcc,0x16,0xcc,0xcc,0xcc,0x52,0xcc,
202 0x04,0xcc,0xcc,0x05,0xcc,0x41,0xcc,0xcc,0x15,0xcc,0xcc,0x16,0xcc,0x52,0xcc,0xcc,
203 0x04,0xcc,0xcc,0xcc,0x41,0xcc,0xcc,0xcc,0x15,0xcc,0xcc,0xcc,0x16,0xcc,0xcc,0xcc,
204 0x04,0xcc,0xcc,0x41,0xcc,0x05,0xcc,0xcc,0x15,0xcc,0xcc,0x52,0xcc,0x16,0xcc,0xcc,
205 0x04,0xcc,0x41,0xcc,0xcc,0xcc,0x05,0xcc,0x15,0xcc,0x52,0xcc,0xcc,0xcc,0x16,0xcc,
206 0x04,0x41,0xcc,0xcc,0xcc,0xcc,0xcc,0x05,0x15,0x52,0xcc,0xcc,0xcc,0xcc,0xcc,0x16,
207 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
208 0x48,0x49,0xcc,0xcc,0xcc,0xcc,0xcc,0x85,0x59,0x5A,0xcc,0xcc,0xcc,0xcc,0xcc,0x96,
209 0x48,0xcc,0x49,0xcc,0xcc,0xcc,0x85,0xcc,0x59,0xcc,0x5A,0xcc,0xcc,0xcc,0x96,0xcc,
210 0x48,0xcc,0xcc,0x49,0xcc,0x85,0xcc,0xcc,0x59,0xcc,0xcc,0x5A,0xcc,0x96,0xcc,0xcc,
211 0x48,0xcc,0xcc,0xcc,0x49,0xcc,0xcc,0xcc,0x59,0xcc,0xcc,0xcc,0x96,0xcc,0xcc,0xcc,
212 0x48,0xcc,0xcc,0x85,0xcc,0x49,0xcc,0xcc,0x59,0xcc,0xcc,0x96,0xcc,0x5A,0xcc,0xcc,
213 0x48,0xcc,0x85,0xcc,0xcc,0xcc,0x49,0xcc,0x59,0xcc,0x96,0xcc,0xcc,0xcc,0x5A,0xcc,
214 0x48,0x85,0xcc,0xcc,0xcc,0xcc,0xcc,0x49,0x59,0x96,0xcc,0xcc,0xcc,0xcc,0xcc,0x5A,
215 };
216
217 static const uint8_t needs[16]={
218 0,1,0,0,
219 2,4,2,0,
220 0,1,0,0,
221 15
222 };
223
224 int x, y, b, r, l;
225 int16_t tmpIt [64*(32+HTAPS_MAX)];
226 uint8_t tmp2t[3][64*(32+HTAPS_MAX)];
227 3241119 int16_t *tmpI= tmpIt;
228 3241119 uint8_t *tmp2= tmp2t[0];
229 const uint8_t *hpel[11];
230 av_assert2(dx<16 && dy<16);
231 3241119 r= brane[dx + 16*dy]&15;
232 3241119 l= brane[dx + 16*dy]>>4;
233
234 3241119 b= needs[l] | needs[r];
235
3/4
✓ Branch 0 taken 3220865 times.
✓ Branch 1 taken 20254 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3220865 times.
3241119 if(p && !p->diag_mc)
236 ✗ b= 15;
237
238
2/2
✓ Branch 0 taken 2902654 times.
✓ Branch 1 taken 338465 times.
3241119 if(b&5){
239
2/2
✓ Branch 0 taken 32989648 times.
✓ Branch 1 taken 2902654 times.
35892302 for(y=0; y < b_h+HTAPS_MAX-1; y++){
240
2/2
✓ Branch 0 taken 151185856 times.
✓ Branch 1 taken 32989648 times.
184175504 for(x=0; x < b_w; x++){
241 151185856 int a_1=src[x + HTAPS_MAX/2-4];
242 151185856 int a0= src[x + HTAPS_MAX/2-3];
243 151185856 int a1= src[x + HTAPS_MAX/2-2];
244 151185856 int a2= src[x + HTAPS_MAX/2-1];
245 151185856 int a3= src[x + HTAPS_MAX/2+0];
246 151185856 int a4= src[x + HTAPS_MAX/2+1];
247 151185856 int a5= src[x + HTAPS_MAX/2+2];
248 151185856 int a6= src[x + HTAPS_MAX/2+3];
249 151185856 int am=0;
250
3/4
✓ Branch 0 taken 145560976 times.
✓ Branch 1 taken 5624880 times.
✓ Branch 2 taken 145560976 times.
✗ Branch 3 not taken.
151185856 if(!p || p->fast_mc){
251 151185856 am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
252 151185856 tmpI[x]= am;
253 151185856 am= (am+16)>>5;
254 }else{
255 ✗ am= p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6);
256 ✗ tmpI[x]= am;
257 ✗ am= (am+32)>>6;
258 }
259
260
2/2
✓ Branch 0 taken 6255 times.
✓ Branch 1 taken 151179601 times.
151185856 if(am&(~255)) am= ~(am>>31);
261 151185856 tmp2[x]= am;
262 }
263 32989648 tmpI+= 64;
264 32989648 tmp2+= 64;
265 32989648 src += stride;
266 }
267 2902654 src -= stride*y;
268 }
269 3241119 src += HTAPS_MAX/2 - 1;
270 3241119 tmp2= tmp2t[1];
271
272
2/2
✓ Branch 0 taken 1995647 times.
✓ Branch 1 taken 1245472 times.
3241119 if(b&2){
273
2/2
✓ Branch 0 taken 8675168 times.
✓ Branch 1 taken 1995647 times.
10670815 for(y=0; y < b_h; y++){
274
2/2
✓ Branch 0 taken 49883520 times.
✓ Branch 1 taken 8675168 times.
58558688 for(x=0; x < b_w+1; x++){
275 49883520 int a_1=src[x + (HTAPS_MAX/2-4)*stride];
276 49883520 int a0= src[x + (HTAPS_MAX/2-3)*stride];
277 49883520 int a1= src[x + (HTAPS_MAX/2-2)*stride];
278 49883520 int a2= src[x + (HTAPS_MAX/2-1)*stride];
279 49883520 int a3= src[x + (HTAPS_MAX/2+0)*stride];
280 49883520 int a4= src[x + (HTAPS_MAX/2+1)*stride];
281 49883520 int a5= src[x + (HTAPS_MAX/2+2)*stride];
282 49883520 int a6= src[x + (HTAPS_MAX/2+3)*stride];
283 49883520 int am=0;
284
3/4
✓ Branch 0 taken 48531952 times.
✓ Branch 1 taken 1351568 times.
✓ Branch 2 taken 48531952 times.
✗ Branch 3 not taken.
49883520 if(!p || p->fast_mc)
285 49883520 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 16)>>5;
286 else
287 ✗ am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 32)>>6;
288
289
2/2
✓ Branch 0 taken 3684 times.
✓ Branch 1 taken 49879836 times.
49883520 if(am&(~255)) am= ~(am>>31);
290 49883520 tmp2[x]= am;
291 }
292 8675168 src += stride;
293 8675168 tmp2+= 64;
294 }
295 1995647 src -= stride*y;
296 }
297 3241119 src += stride*(HTAPS_MAX/2 - 1);
298 3241119 tmp2= tmp2t[2];
299 3241119 tmpI= tmpIt;
300
2/2
✓ Branch 0 taken 1956310 times.
✓ Branch 1 taken 1284809 times.
3241119 if(b&4){
301
2/2
✓ Branch 0 taken 8485272 times.
✓ Branch 1 taken 1956310 times.
10441582 for(y=0; y < b_h; y++){
302
2/2
✓ Branch 0 taken 40817200 times.
✓ Branch 1 taken 8485272 times.
49302472 for(x=0; x < b_w; x++){
303 40817200 int a_1=tmpI[x + (HTAPS_MAX/2-4)*64];
304 40817200 int a0= tmpI[x + (HTAPS_MAX/2-3)*64];
305 40817200 int a1= tmpI[x + (HTAPS_MAX/2-2)*64];
306 40817200 int a2= tmpI[x + (HTAPS_MAX/2-1)*64];
307 40817200 int a3= tmpI[x + (HTAPS_MAX/2+0)*64];
308 40817200 int a4= tmpI[x + (HTAPS_MAX/2+1)*64];
309 40817200 int a5= tmpI[x + (HTAPS_MAX/2+2)*64];
310 40817200 int a6= tmpI[x + (HTAPS_MAX/2+3)*64];
311 40817200 int am=0;
312
3/4
✓ Branch 0 taken 38320176 times.
✓ Branch 1 taken 2497024 times.
✓ Branch 2 taken 38320176 times.
✗ Branch 3 not taken.
40817200 if(!p || p->fast_mc)
313 40817200 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 512)>>10;
314 else
315 ✗ am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 2048)>>12;
316
2/2
✓ Branch 0 taken 6658 times.
✓ Branch 1 taken 40810542 times.
40817200 if(am&(~255)) am= ~(am>>31);
317 40817200 tmp2[x]= am;
318 }
319 8485272 tmpI+= 64;
320 8485272 tmp2+= 64;
321 }
322 }
323
324 3241119 hpel[ 0]= src;
325 3241119 hpel[ 1]= tmp2t[0] + 64*(HTAPS_MAX/2-1);
326 3241119 hpel[ 2]= src + 1;
327
328 3241119 hpel[ 4]= tmp2t[1];
329 3241119 hpel[ 5]= tmp2t[2];
330 3241119 hpel[ 6]= tmp2t[1] + 1;
331
332 3241119 hpel[ 8]= src + stride;
333 3241119 hpel[ 9]= hpel[1] + 64;
334 3241119 hpel[10]= hpel[8] + 1;
335
336 #define MC_STRIDE(x) (needs[x] ? 64 : stride)
337
338
2/2
✓ Branch 0 taken 789096 times.
✓ Branch 1 taken 2452023 times.
3241119 if(b==15){
339 789096 int dxy = dx / 8 + dy / 8 * 4;
340 789096 const uint8_t *src1 = hpel[dxy ];
341 789096 const uint8_t *src2 = hpel[dxy + 1];
342 789096 const uint8_t *src3 = hpel[dxy + 4];
343 789096 const uint8_t *src4 = hpel[dxy + 5];
344
2/2
✓ Branch 0 taken 197858 times.
✓ Branch 1 taken 591238 times.
789096 int stride1 = MC_STRIDE(dxy);
345
2/2
✓ Branch 0 taken 202020 times.
✓ Branch 1 taken 587076 times.
789096 int stride2 = MC_STRIDE(dxy + 1);
346
2/2
✓ Branch 0 taken 191088 times.
✓ Branch 1 taken 598008 times.
789096 int stride3 = MC_STRIDE(dxy + 4);
347
2/2
✓ Branch 0 taken 198130 times.
✓ Branch 1 taken 590966 times.
789096 int stride4 = MC_STRIDE(dxy + 5);
348 789096 dx&=7;
349 789096 dy&=7;
350
2/2
✓ Branch 0 taken 3464504 times.
✓ Branch 1 taken 789096 times.
4253600 for(y=0; y < b_h; y++){
351
2/2
✓ Branch 0 taken 16562072 times.
✓ Branch 1 taken 3464504 times.
20026576 for(x=0; x < b_w; x++){
352 16562072 dst[x]= ((8-dx)*(8-dy)*src1[x] + dx*(8-dy)*src2[x]+
353 16562072 (8-dx)* dy *src3[x] + dx* dy *src4[x]+32)>>6;
354 }
355 3464504 src1+=stride1;
356 3464504 src2+=stride2;
357 3464504 src3+=stride3;
358 3464504 src4+=stride4;
359 3464504 dst +=stride;
360 }
361 }else{
362 2452023 const uint8_t *src1= hpel[l];
363 2452023 const uint8_t *src2= hpel[r];
364
2/2
✓ Branch 0 taken 601434 times.
✓ Branch 1 taken 1850589 times.
2452023 int stride1 = MC_STRIDE(l);
365
2/2
✓ Branch 0 taken 656533 times.
✓ Branch 1 taken 1795490 times.
2452023 int stride2 = MC_STRIDE(r);
366 2452023 int a= weight[((dx&7) + (8*(dy&7)))];
367 2452023 int b= 8-a;
368
2/2
✓ Branch 0 taken 10729700 times.
✓ Branch 1 taken 2452023 times.
13181723 for(y=0; y < b_h; y++){
369
2/2
✓ Branch 0 taken 52953992 times.
✓ Branch 1 taken 10729700 times.
63683692 for(x=0; x < b_w; x++){
370 52953992 dst[x]= (a*src1[x] + b*src2[x] + 4)>>3;
371 }
372 10729700 src1+=stride1;
373 10729700 src2+=stride2;
374 10729700 dst +=stride;
375 }
376 }
377 3241119 }
378
379 9383443 void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, ptrdiff_t stride, int sx, int sy, int b_w, int b_h, const BlockNode *block, int plane_index, int w, int h){
380
2/2
✓ Branch 0 taken 1261628 times.
✓ Branch 1 taken 8121815 times.
9383443 if(block->type & BLOCK_INTRA){
381 int x, y;
382 1261628 const unsigned color = block->color[plane_index];
383 1261628 const unsigned color4 = color*0x01010101;
384
2/2
✓ Branch 0 taken 18314 times.
✓ Branch 1 taken 1243314 times.
1261628 if(b_w==32){
385
2/2
✓ Branch 0 taken 586048 times.
✓ Branch 1 taken 18314 times.
604362 for(y=0; y < b_h; y++){
386 586048 *(uint32_t*)&dst[0 + y*stride]= color4;
387 586048 *(uint32_t*)&dst[4 + y*stride]= color4;
388 586048 *(uint32_t*)&dst[8 + y*stride]= color4;
389 586048 *(uint32_t*)&dst[12+ y*stride]= color4;
390 586048 *(uint32_t*)&dst[16+ y*stride]= color4;
391 586048 *(uint32_t*)&dst[20+ y*stride]= color4;
392 586048 *(uint32_t*)&dst[24+ y*stride]= color4;
393 586048 *(uint32_t*)&dst[28+ y*stride]= color4;
394 }
395
2/2
✓ Branch 0 taken 131847 times.
✓ Branch 1 taken 1111467 times.
1243314 }else if(b_w==16){
396
2/2
✓ Branch 0 taken 1979152 times.
✓ Branch 1 taken 131847 times.
2110999 for(y=0; y < b_h; y++){
397 1979152 *(uint32_t*)&dst[0 + y*stride]= color4;
398 1979152 *(uint32_t*)&dst[4 + y*stride]= color4;
399 1979152 *(uint32_t*)&dst[8 + y*stride]= color4;
400 1979152 *(uint32_t*)&dst[12+ y*stride]= color4;
401 }
402
2/2
✓ Branch 0 taken 545817 times.
✓ Branch 1 taken 565650 times.
1111467 }else if(b_w==8){
403
2/2
✓ Branch 0 taken 4273750 times.
✓ Branch 1 taken 545817 times.
4819567 for(y=0; y < b_h; y++){
404 4273750 *(uint32_t*)&dst[0 + y*stride]= color4;
405 4273750 *(uint32_t*)&dst[4 + y*stride]= color4;
406 }
407
2/2
✓ Branch 0 taken 564556 times.
✓ Branch 1 taken 1094 times.
565650 }else if(b_w==4){
408
2/2
✓ Branch 0 taken 2300822 times.
✓ Branch 1 taken 564556 times.
2865378 for(y=0; y < b_h; y++){
409 2300822 *(uint32_t*)&dst[0 + y*stride]= color4;
410 }
411 }else{
412
2/2
✓ Branch 0 taken 4748 times.
✓ Branch 1 taken 1094 times.
5842 for(y=0; y < b_h; y++){
413
2/2
✓ Branch 0 taken 8488 times.
✓ Branch 1 taken 4748 times.
13236 for(x=0; x < b_w; x++){
414 8488 dst[x + y*stride]= color;
415 }
416 }
417 }
418 }else{
419 8121815 const uint8_t *src = s->last_picture[block->ref]->data[plane_index];
420
2/2
✓ Branch 0 taken 5220568 times.
✓ Branch 1 taken 2901247 times.
8121815 const int scale= plane_index ? (2*s->mv_scale)>>s->chroma_h_shift : 2*s->mv_scale;
421 8121815 int mx= block->mx*scale;
422 8121815 int my= block->my*scale;
423 8121815 const int dx= mx&15;
424 8121815 const int dy= my&15;
425 8121815 const int tab_index= 3 - (b_w>>2) + (b_w>>4);
426 8121815 sx += (mx>>4) - (HTAPS_MAX/2-1);
427 8121815 sy += (my>>4) - (HTAPS_MAX/2-1);
428 8121815 src += sx + sy*stride;
429
4/4
✓ Branch 0 taken 8121191 times.
✓ Branch 1 taken 624 times.
✓ Branch 2 taken 7610811 times.
✓ Branch 3 taken 511004 times.
8121815 if( (unsigned)sx >= FFMAX(w - b_w - (HTAPS_MAX-2), 0)
430
4/4
✓ Branch 0 taken 7607887 times.
✓ Branch 1 taken 2924 times.
✓ Branch 2 taken 645506 times.
✓ Branch 3 taken 6965305 times.
7610811 || (unsigned)sy >= FFMAX(h - b_h - (HTAPS_MAX-2), 0)){
431 1156510 s->vdsp.emulated_edge_mc(tmp + MB_SIZE, src,
432 stride, stride,
433 b_w+HTAPS_MAX-1, b_h+HTAPS_MAX-1,
434 sx, sy, w, h);
435 1156510 src= tmp + MB_SIZE;
436 }
437
438 av_assert2(s->chroma_h_shift == s->chroma_v_shift); // only one mv_scale
439
440 av_assert2((tab_index>=0 && tab_index<4) || b_w==32);
441
4/4
✓ Branch 0 taken 5956237 times.
✓ Branch 1 taken 2165578 times.
✓ Branch 2 taken 4902023 times.
✓ Branch 3 taken 1054214 times.
8121815 if( (dx&3) || (dy&3)
442
6/6
✓ Branch 0 taken 350381 times.
✓ Branch 1 taken 4551642 times.
✓ Branch 2 taken 205473 times.
✓ Branch 3 taken 144908 times.
✓ Branch 4 taken 204400 times.
✓ Branch 5 taken 1073 times.
4902023 || !(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h)
443
1/2
✓ Branch 0 taken 4900950 times.
✗ Branch 1 not taken.
4900950 || (b_w&(b_w-1))
444
1/2
✓ Branch 0 taken 4900950 times.
✗ Branch 1 not taken.
4900950 || b_w == 1
445
1/2
✓ Branch 0 taken 4900950 times.
✗ Branch 1 not taken.
4900950 || b_h == 1
446
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4900950 times.
4900950 || !s->plane[plane_index].fast_mc )
447 3220865 mc_block(&s->plane[plane_index], dst, src, stride, b_w, b_h, dx, dy);
448
2/2
✓ Branch 0 taken 288126 times.
✓ Branch 1 taken 4612824 times.
4900950 else if(b_w==32){
449 int y;
450
2/2
✓ Branch 0 taken 576252 times.
✓ Branch 1 taken 288126 times.
864378 for(y=0; y<b_h; y+=16){
451 576252 s->put_snow_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 3 + (y+3)*stride,stride);
452 576252 s->put_snow_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 19 + (y+3)*stride,stride);
453 }
454
2/2
✓ Branch 0 taken 4263516 times.
✓ Branch 1 taken 349308 times.
4612824 }else if(b_w==b_h)
455 4263516 s->put_snow_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 3 + 3*stride,stride);
456
2/2
✓ Branch 0 taken 204400 times.
✓ Branch 1 taken 144908 times.
349308 else if(b_w==2*b_h){
457 204400 s->put_snow_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 3 + 3*stride,stride);
458 204400 s->put_snow_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 3 + b_h + 3*stride,stride);
459 }else{
460 av_assert2(2*b_w==b_h);
461 144908 s->put_snow_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 3 + 3*stride ,stride);
462 144908 s->put_snow_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 3 + 3*stride+b_w*stride,stride);
463 }
464 }
465 9383443 }
466
467 #define mca(dx,dy,b_w)\
468 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int h){\
469 av_assert2(h==b_w);\
470 mc_block(NULL, dst, src-(HTAPS_MAX/2-1)-(HTAPS_MAX/2-1)*stride, stride, b_w, b_w, dx, dy);\
471 }
472
473 5531 mca( 8, 0,16)
474 4969 mca( 0, 8,16)
475 9754 mca( 8, 8,16)
476 ✗ mca( 8, 0,8)
477 ✗ mca( 0, 8,8)
478 ✗ mca( 8, 8,8)
479
480 24 static av_cold void snow_static_init(void)
481 {
482
2/2
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 24 times.
216 for (int i = 0; i < MAX_REF_FRAMES; i++)
483
2/2
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 192 times.
1728 for (int j = 0; j < MAX_REF_FRAMES; j++)
484 1536 ff_scale_mv_ref[i][j] = 256 * (i + 1) / (j + 1);
485 24 }
486
487 33 av_cold int ff_snow_common_init(AVCodecContext *avctx){
488 static AVOnce init_static_once = AV_ONCE_INIT;
489 33 SnowContext *s = avctx->priv_data;
490 int width, height;
491 int i;
492
493 33 s->avctx= avctx;
494 33 s->max_ref_frames=1; //just make sure it's not an invalid value in case of no initial keyframe
495 33 s->spatial_decomposition_count = 1;
496
497 33 ff_videodsp_init(&s->vdsp, 8);
498 33 ff_dwt_init(&s->dwt);
499
500 33 init_qpel(s);
501
502 #define mcfh(dx,dy)\
503 s->hdsp.put_pixels_tab [0][dy/4+dx/8]=\
504 s->hdsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
505 mc_block_hpel ## dx ## dy ## 16;\
506 s->hdsp.put_pixels_tab [1][dy/4+dx/8]=\
507 s->hdsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
508 mc_block_hpel ## dx ## dy ## 8;
509
510 33 mcfh(8, 0)
511 33 mcfh(0, 8)
512 33 mcfh(8, 8)
513
514 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
515
516 33 width= s->avctx->width;
517 33 height= s->avctx->height;
518
519
1/2
✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
33 if (!FF_ALLOCZ_TYPED_ARRAY(s->spatial_idwt_buffer, width * height) ||
520
1/2
✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
33 !FF_ALLOCZ_TYPED_ARRAY(s->spatial_dwt_buffer, width * height) || //FIXME this does not belong here
521
1/2
✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
33 !FF_ALLOCZ_TYPED_ARRAY(s->temp_dwt_buffer, width) ||
522
1/2
✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
33 !FF_ALLOCZ_TYPED_ARRAY(s->temp_idwt_buffer, width) ||
523
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 33 times.
33 !FF_ALLOCZ_TYPED_ARRAY(s->run_buffer, ((width + 1) >> 1) * ((height + 1) >> 1) + 1))
524 ✗ return AVERROR(ENOMEM);
525
526
2/2
✓ Branch 0 taken 264 times.
✓ Branch 1 taken 33 times.
297 for(i=0; i<MAX_REF_FRAMES; i++) {
527 264 s->last_picture[i] = av_frame_alloc();
528
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 264 times.
264 if (!s->last_picture[i])
529 ✗ return AVERROR(ENOMEM);
530 }
531
532 33 s->mconly_picture = av_frame_alloc();
533 33 s->current_picture = av_frame_alloc();
534
2/4
✓ Branch 0 taken 33 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 33 times.
33 if (!s->mconly_picture || !s->current_picture)
535 ✗ return AVERROR(ENOMEM);
536
537 33 ff_thread_once(&init_static_once, snow_static_init);
538
539 33 return 0;
540 }
541
542 981 int ff_snow_common_init_after_header(AVCodecContext *avctx) {
543 981 SnowContext *s = avctx->priv_data;
544 int plane_index, level, orientation;
545
546
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 948 times.
981 if(!s->scratchbuf) {
547
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 33 times.
33 if (!FF_ALLOCZ_TYPED_ARRAY(s->scratchbuf, FFMAX(s->current_picture->linesize[0], 2*avctx->width+256) * 7 * MB_SIZE))
548 ✗ return AVERROR(ENOMEM);
549 }
550
551
2/2
✓ Branch 0 taken 2943 times.
✓ Branch 1 taken 981 times.
3924 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
552 2943 int w= s->avctx->width;
553 2943 int h= s->avctx->height;
554
555
2/2
✓ Branch 0 taken 1962 times.
✓ Branch 1 taken 981 times.
2943 if(plane_index){
556 1962 w = AV_CEIL_RSHIFT(w, s->chroma_h_shift);
557 1962 h = AV_CEIL_RSHIFT(h, s->chroma_v_shift);
558 }
559 2943 s->plane[plane_index].width = w;
560 2943 s->plane[plane_index].height= h;
561
562
2/2
✓ Branch 0 taken 14631 times.
✓ Branch 1 taken 2943 times.
17574 for(level=s->spatial_decomposition_count-1; level>=0; level--){
563
2/2
✓ Branch 0 taken 46836 times.
✓ Branch 1 taken 14631 times.
61467 for(orientation=level ? 1 : 0; orientation<4; orientation++){
564 46836 SubBand *b= &s->plane[plane_index].band[level][orientation];
565
566 46836 b->buf= s->spatial_dwt_buffer;
567 46836 b->level= level;
568 46836 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
569 46836 b->width = (w + !(orientation&1))>>1;
570 46836 b->height= (h + !(orientation>1))>>1;
571
572 46836 b->stride_line = 1 << (s->spatial_decomposition_count - level);
573 46836 b->buf_x_offset = 0;
574 46836 b->buf_y_offset = 0;
575
576
2/2
✓ Branch 0 taken 29262 times.
✓ Branch 1 taken 17574 times.
46836 if(orientation&1){
577 29262 b->buf += (w+1)>>1;
578 29262 b->buf_x_offset = (w+1)>>1;
579 }
580
2/2
✓ Branch 0 taken 29262 times.
✓ Branch 1 taken 17574 times.
46836 if(orientation>1){
581 29262 b->buf += b->stride>>1;
582 29262 b->buf_y_offset = b->stride_line >> 1;
583 }
584 46836 b->ibuf= s->spatial_idwt_buffer + (b->buf - s->spatial_dwt_buffer);
585
586
2/2
✓ Branch 0 taken 35064 times.
✓ Branch 1 taken 11772 times.
46836 if(level)
587 35064 b->parent= &s->plane[plane_index].band[level-1][orientation];
588 //FIXME avoid this realloc
589 46836 av_freep(&b->x_coeff);
590 46836 b->x_coeff = av_calloc((b->width + 1) * b->height + 1,
591 sizeof(*b->x_coeff));
592
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 46836 times.
46836 if (!b->x_coeff)
593 ✗ return AVERROR(ENOMEM);
594 }
595 14631 w= (w+1)>>1;
596 14631 h= (h+1)>>1;
597 }
598 }
599
600 981 return 0;
601 }
602
603 981 int ff_snow_frames_prepare(SnowContext *s)
604 {
605 AVFrame *tmp;
606
607 981 tmp= s->last_picture[s->max_ref_frames-1];
608
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 981 times.
981 for (int i = s->max_ref_frames - 1; i > 0; i--)
609 ✗ s->last_picture[i] = s->last_picture[i-1];
610 981 s->last_picture[0] = s->current_picture;
611 981 s->current_picture = tmp;
612
613 981 av_frame_unref(s->current_picture);
614
615
2/2
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 876 times.
981 if(s->keyframe){
616 105 s->ref_frames= 0;
617 105 s->current_picture->flags |= AV_FRAME_FLAG_KEY;
618 }else{
619 int i;
620
3/4
✓ Branch 0 taken 876 times.
✓ Branch 1 taken 876 times.
✓ Branch 2 taken 876 times.
✗ Branch 3 not taken.
1752 for(i=0; i<s->max_ref_frames && s->last_picture[i]->data[0]; i++)
621
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
876 if(i && (s->last_picture[i-1]->flags & AV_FRAME_FLAG_KEY))
622 ✗ break;
623 876 s->ref_frames= i;
624
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 if(s->ref_frames==0){
625 ✗ av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n");
626 ✗ return AVERROR_INVALIDDATA;
627 }
628 876 s->current_picture->flags &= ~AV_FRAME_FLAG_KEY;
629 }
630
631 981 return 0;
632 }
633
634 33 av_cold void ff_snow_common_end(SnowContext *s)
635 {
636 int plane_index, level, orientation, i;
637
638 33 av_freep(&s->spatial_dwt_buffer);
639 33 av_freep(&s->temp_dwt_buffer);
640 33 av_freep(&s->spatial_idwt_buffer);
641 33 av_freep(&s->temp_idwt_buffer);
642 33 av_freep(&s->run_buffer);
643
644 33 av_freep(&s->block);
645 33 av_freep(&s->scratchbuf);
646
647
2/2
✓ Branch 0 taken 264 times.
✓ Branch 1 taken 33 times.
297 for(i=0; i<MAX_REF_FRAMES; i++){
648 264 av_frame_free(&s->last_picture[i]);
649 }
650
651
2/2
✓ Branch 0 taken 132 times.
✓ Branch 1 taken 33 times.
165 for(plane_index=0; plane_index < MAX_PLANES; plane_index++){
652
2/2
✓ Branch 0 taken 1056 times.
✓ Branch 1 taken 132 times.
1188 for(level=MAX_DECOMPOSITIONS-1; level>=0; level--){
653
2/2
✓ Branch 0 taken 3300 times.
✓ Branch 1 taken 1056 times.
4356 for(orientation=level ? 1 : 0; orientation<4; orientation++){
654 3300 SubBand *b= &s->plane[plane_index].band[level][orientation];
655
656 3300 av_freep(&b->x_coeff);
657 }
658 }
659 }
660 33 av_frame_free(&s->mconly_picture);
661 33 av_frame_free(&s->current_picture);
662 33 }
663