FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/snow.c
Date: 2022-01-21 12:56:39
Exec Total Coverage
Lines: 376 439 85.6%
Branches: 194 258 75.2%

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 "libavutil/intmath.h"
22 #include "libavutil/log.h"
23 #include "libavutil/opt.h"
24 #include "libavutil/thread.h"
25 #include "avcodec.h"
26 #include "me_cmp.h"
27 #include "snow_dwt.h"
28 #include "internal.h"
29 #include "snow.h"
30 #include "snowdata.h"
31
32 #include "rangecoder.h"
33 #include "mathops.h"
34
35
36 710775 void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h,
37 int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8){
38 int y, x;
39 IDWTELEM * dst;
40
2/2
✓ Branch 0 taken 3810240 times.
✓ Branch 1 taken 710775 times.
4521015 for(y=0; y<b_h; y++){
41 //FIXME ugly misuse of obmc_stride
42 3810240 const uint8_t *obmc1= obmc + y*obmc_stride;
43 3810240 const uint8_t *obmc2= obmc1+ (obmc_stride>>1);
44 3810240 const uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1);
45 3810240 const uint8_t *obmc4= obmc3+ (obmc_stride>>1);
46
1/2
✓ Branch 0 taken 3810240 times.
✗ Branch 1 not taken.
3810240 dst = slice_buffer_get_line(sb, src_y + y);
47
2/2
✓ Branch 0 taken 23846400 times.
✓ Branch 1 taken 3810240 times.
27656640 for(x=0; x<b_w; x++){
48 23846400 int v= obmc1[x] * block[3][x + y*src_stride]
49 23846400 +obmc2[x] * block[2][x + y*src_stride]
50 23846400 +obmc3[x] * block[1][x + y*src_stride]
51 23846400 +obmc4[x] * block[0][x + y*src_stride];
52
53 23846400 v <<= 8 - LOG2_OBMC_MAX;
54 if(FRAC_BITS != 8){
55 23846400 v >>= 8 - FRAC_BITS;
56 }
57
1/2
✓ Branch 0 taken 23846400 times.
✗ Branch 1 not taken.
23846400 if(add){
58 23846400 v += dst[x + src_x];
59 23846400 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS;
60
2/2
✓ Branch 0 taken 1139 times.
✓ Branch 1 taken 23845261 times.
23846400 if(v&(~255)) v= ~(v>>31);
61 23846400 dst8[x + y*src_stride] = v;
62 }else{
63 dst[x + src_x] -= v;
64 }
65 }
66 }
67 710775 }
68
69 920 int ff_snow_get_buffer(SnowContext *s, AVFrame *frame)
70 {
71 int ret, i;
72 920 int edges_needed = av_codec_is_encoder(s->avctx->codec);
73
74 920 frame->width = s->avctx->width ;
75 920 frame->height = s->avctx->height;
76
2/2
✓ Branch 0 taken 459 times.
✓ Branch 1 taken 461 times.
920 if (edges_needed) {
77 459 frame->width += 2 * EDGE_WIDTH;
78 459 frame->height += 2 * EDGE_WIDTH;
79 }
80
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 920 times.
920 if ((ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
81 return ret;
82
2/2
✓ Branch 0 taken 459 times.
✓ Branch 1 taken 461 times.
920 if (edges_needed) {
83
2/2
✓ Branch 0 taken 1377 times.
✓ Branch 1 taken 459 times.
1836 for (i = 0; frame->data[i]; i++) {
84
2/2
✓ Branch 0 taken 918 times.
✓ Branch 1 taken 459 times.
1377 int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) *
85 1377 frame->linesize[i] +
86
2/2
✓ Branch 0 taken 918 times.
✓ Branch 1 taken 459 times.
1377 (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0));
87 1377 frame->data[i] += offset;
88 }
89 459 frame->width = s->avctx->width;
90 459 frame->height = s->avctx->height;
91 }
92
93 920 return 0;
94 }
95
96 101 void ff_snow_reset_contexts(SnowContext *s){ //FIXME better initial contexts
97 int plane_index, level, orientation;
98
99
2/2
✓ Branch 0 taken 303 times.
✓ Branch 1 taken 101 times.
404 for(plane_index=0; plane_index<3; plane_index++){
100
2/2
✓ Branch 0 taken 2424 times.
✓ Branch 1 taken 303 times.
2727 for(level=0; level<MAX_DECOMPOSITIONS; level++){
101
2/2
✓ Branch 0 taken 7575 times.
✓ Branch 1 taken 2424 times.
9999 for(orientation=level ? 1:0; orientation<4; orientation++){
102 7575 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state));
103 }
104 }
105 }
106 101 memset(s->header_state, MID_STATE, sizeof(s->header_state));
107 101 memset(s->block_state, MID_STATE, sizeof(s->block_state));
108 101 }
109
110 470 int ff_snow_alloc_blocks(SnowContext *s){
111 470 int w= AV_CEIL_RSHIFT(s->avctx->width, LOG2_MB_SIZE);
112 470 int h= AV_CEIL_RSHIFT(s->avctx->height, LOG2_MB_SIZE);
113
114 470 s->b_width = w;
115 470 s->b_height= h;
116
117 470 av_free(s->block);
118 470 s->block = av_calloc(w * h, sizeof(*s->block) << (s->block_max_depth*2));
119
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 470 times.
470 if (!s->block)
120 return AVERROR(ENOMEM);
121
122 470 return 0;
123 }
124
125 2519006 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){
126 static const uint8_t weight[64]={
127 8,7,6,5,4,3,2,1,
128 7,7,0,0,0,0,0,1,
129 6,0,6,0,0,0,2,0,
130 5,0,0,5,0,3,0,0,
131 4,0,0,0,4,0,0,0,
132 3,0,0,5,0,3,0,0,
133 2,0,6,0,0,0,2,0,
134 1,7,0,0,0,0,0,1,
135 };
136
137 static const uint8_t brane[256]={
138 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
139 0x04,0x05,0xcc,0xcc,0xcc,0xcc,0xcc,0x41,0x15,0x16,0xcc,0xcc,0xcc,0xcc,0xcc,0x52,
140 0x04,0xcc,0x05,0xcc,0xcc,0xcc,0x41,0xcc,0x15,0xcc,0x16,0xcc,0xcc,0xcc,0x52,0xcc,
141 0x04,0xcc,0xcc,0x05,0xcc,0x41,0xcc,0xcc,0x15,0xcc,0xcc,0x16,0xcc,0x52,0xcc,0xcc,
142 0x04,0xcc,0xcc,0xcc,0x41,0xcc,0xcc,0xcc,0x15,0xcc,0xcc,0xcc,0x16,0xcc,0xcc,0xcc,
143 0x04,0xcc,0xcc,0x41,0xcc,0x05,0xcc,0xcc,0x15,0xcc,0xcc,0x52,0xcc,0x16,0xcc,0xcc,
144 0x04,0xcc,0x41,0xcc,0xcc,0xcc,0x05,0xcc,0x15,0xcc,0x52,0xcc,0xcc,0xcc,0x16,0xcc,
145 0x04,0x41,0xcc,0xcc,0xcc,0xcc,0xcc,0x05,0x15,0x52,0xcc,0xcc,0xcc,0xcc,0xcc,0x16,
146 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x56,0x56,0x56,0x56,0x56,0x56,
147 0x48,0x49,0xcc,0xcc,0xcc,0xcc,0xcc,0x85,0x59,0x5A,0xcc,0xcc,0xcc,0xcc,0xcc,0x96,
148 0x48,0xcc,0x49,0xcc,0xcc,0xcc,0x85,0xcc,0x59,0xcc,0x5A,0xcc,0xcc,0xcc,0x96,0xcc,
149 0x48,0xcc,0xcc,0x49,0xcc,0x85,0xcc,0xcc,0x59,0xcc,0xcc,0x5A,0xcc,0x96,0xcc,0xcc,
150 0x48,0xcc,0xcc,0xcc,0x49,0xcc,0xcc,0xcc,0x59,0xcc,0xcc,0xcc,0x96,0xcc,0xcc,0xcc,
151 0x48,0xcc,0xcc,0x85,0xcc,0x49,0xcc,0xcc,0x59,0xcc,0xcc,0x96,0xcc,0x5A,0xcc,0xcc,
152 0x48,0xcc,0x85,0xcc,0xcc,0xcc,0x49,0xcc,0x59,0xcc,0x96,0xcc,0xcc,0xcc,0x5A,0xcc,
153 0x48,0x85,0xcc,0xcc,0xcc,0xcc,0xcc,0x49,0x59,0x96,0xcc,0xcc,0xcc,0xcc,0xcc,0x5A,
154 };
155
156 static const uint8_t needs[16]={
157 0,1,0,0,
158 2,4,2,0,
159 0,1,0,0,
160 15
161 };
162
163 int x, y, b, r, l;
164 int16_t tmpIt [64*(32+HTAPS_MAX)];
165 uint8_t tmp2t[3][64*(32+HTAPS_MAX)];
166 2519006 int16_t *tmpI= tmpIt;
167 2519006 uint8_t *tmp2= tmp2t[0];
168 const uint8_t *hpel[11];
169 av_assert2(dx<16 && dy<16);
170 2519006 r= brane[dx + 16*dy]&15;
171 2519006 l= brane[dx + 16*dy]>>4;
172
173 2519006 b= needs[l] | needs[r];
174
3/4
✓ Branch 0 taken 2498748 times.
✓ Branch 1 taken 20258 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2498748 times.
2519006 if(p && !p->diag_mc)
175 b= 15;
176
177
2/2
✓ Branch 0 taken 2247477 times.
✓ Branch 1 taken 271529 times.
2519006 if(b&5){
178
2/2
✓ Branch 0 taken 25295331 times.
✓ Branch 1 taken 2247477 times.
27542808 for(y=0; y < b_h+HTAPS_MAX-1; y++){
179
2/2
✓ Branch 0 taken 112607912 times.
✓ Branch 1 taken 25295331 times.
137903243 for(x=0; x < b_w; x++){
180 112607912 int a_1=src[x + HTAPS_MAX/2-4];
181 112607912 int a0= src[x + HTAPS_MAX/2-3];
182 112607912 int a1= src[x + HTAPS_MAX/2-2];
183 112607912 int a2= src[x + HTAPS_MAX/2-1];
184 112607912 int a3= src[x + HTAPS_MAX/2+0];
185 112607912 int a4= src[x + HTAPS_MAX/2+1];
186 112607912 int a5= src[x + HTAPS_MAX/2+2];
187 112607912 int a6= src[x + HTAPS_MAX/2+3];
188 112607912 int am=0;
189
3/4
✓ Branch 0 taken 106986712 times.
✓ Branch 1 taken 5621200 times.
✓ Branch 2 taken 106986712 times.
✗ Branch 3 not taken.
112607912 if(!p || p->fast_mc){
190 112607912 am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5);
191 112607912 tmpI[x]= am;
192 112607912 am= (am+16)>>5;
193 }else{
194 am= p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6);
195 tmpI[x]= am;
196 am= (am+32)>>6;
197 }
198
199
2/2
✓ Branch 0 taken 6186 times.
✓ Branch 1 taken 112601726 times.
112607912 if(am&(~255)) am= ~(am>>31);
200 112607912 tmp2[x]= am;
201 }
202 25295331 tmpI+= 64;
203 25295331 tmp2+= 64;
204 25295331 src += stride;
205 }
206 2247477 src -= stride*y;
207 }
208 2519006 src += HTAPS_MAX/2 - 1;
209 2519006 tmp2= tmp2t[1];
210
211
2/2
✓ Branch 0 taken 1519805 times.
✓ Branch 1 taken 999201 times.
2519006 if(b&2){
212
2/2
✓ Branch 0 taken 6403948 times.
✓ Branch 1 taken 1519805 times.
7923753 for(y=0; y < b_h; y++){
213
2/2
✓ Branch 0 taken 35471788 times.
✓ Branch 1 taken 6403948 times.
41875736 for(x=0; x < b_w+1; x++){
214 35471788 int a_1=src[x + (HTAPS_MAX/2-4)*stride];
215 35471788 int a0= src[x + (HTAPS_MAX/2-3)*stride];
216 35471788 int a1= src[x + (HTAPS_MAX/2-2)*stride];
217 35471788 int a2= src[x + (HTAPS_MAX/2-1)*stride];
218 35471788 int a3= src[x + (HTAPS_MAX/2+0)*stride];
219 35471788 int a4= src[x + (HTAPS_MAX/2+1)*stride];
220 35471788 int a5= src[x + (HTAPS_MAX/2+2)*stride];
221 35471788 int a6= src[x + (HTAPS_MAX/2+3)*stride];
222 35471788 int am=0;
223
3/4
✓ Branch 0 taken 34116412 times.
✓ Branch 1 taken 1355376 times.
✓ Branch 2 taken 34116412 times.
✗ Branch 3 not taken.
35471788 if(!p || p->fast_mc)
224 35471788 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 16)>>5;
225 else
226 am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 32)>>6;
227
228
2/2
✓ Branch 0 taken 3682 times.
✓ Branch 1 taken 35468106 times.
35471788 if(am&(~255)) am= ~(am>>31);
229 35471788 tmp2[x]= am;
230 }
231 6403948 src += stride;
232 6403948 tmp2+= 64;
233 }
234 1519805 src -= stride*y;
235 }
236 2519006 src += stride*(HTAPS_MAX/2 - 1);
237 2519006 tmp2= tmp2t[2];
238 2519006 tmpI= tmpIt;
239
2/2
✓ Branch 0 taken 1513316 times.
✓ Branch 1 taken 1005690 times.
2519006 if(b&4){
240
2/2
✓ Branch 0 taken 6376956 times.
✓ Branch 1 taken 1513316 times.
7890272 for(y=0; y < b_h; y++){
241
2/2
✓ Branch 0 taken 29518952 times.
✓ Branch 1 taken 6376956 times.
35895908 for(x=0; x < b_w; x++){
242 29518952 int a_1=tmpI[x + (HTAPS_MAX/2-4)*64];
243 29518952 int a0= tmpI[x + (HTAPS_MAX/2-3)*64];
244 29518952 int a1= tmpI[x + (HTAPS_MAX/2-2)*64];
245 29518952 int a2= tmpI[x + (HTAPS_MAX/2-1)*64];
246 29518952 int a3= tmpI[x + (HTAPS_MAX/2+0)*64];
247 29518952 int a4= tmpI[x + (HTAPS_MAX/2+1)*64];
248 29518952 int a5= tmpI[x + (HTAPS_MAX/2+2)*64];
249 29518952 int a6= tmpI[x + (HTAPS_MAX/2+3)*64];
250 29518952 int am=0;
251
3/4
✓ Branch 0 taken 27018856 times.
✓ Branch 1 taken 2500096 times.
✓ Branch 2 taken 27018856 times.
✗ Branch 3 not taken.
29518952 if(!p || p->fast_mc)
252 29518952 am= (20*(a2+a3) - 5*(a1+a4) + (a0+a5) + 512)>>10;
253 else
254 am= (p->hcoeff[0]*(a2+a3) + p->hcoeff[1]*(a1+a4) + p->hcoeff[2]*(a0+a5) + p->hcoeff[3]*(a_1+a6) + 2048)>>12;
255
2/2
✓ Branch 0 taken 6685 times.
✓ Branch 1 taken 29512267 times.
29518952 if(am&(~255)) am= ~(am>>31);
256 29518952 tmp2[x]= am;
257 }
258 6376956 tmpI+= 64;
259 6376956 tmp2+= 64;
260 }
261 }
262
263 2519006 hpel[ 0]= src;
264 2519006 hpel[ 1]= tmp2t[0] + 64*(HTAPS_MAX/2-1);
265 2519006 hpel[ 2]= src + 1;
266
267 2519006 hpel[ 4]= tmp2t[1];
268 2519006 hpel[ 5]= tmp2t[2];
269 2519006 hpel[ 6]= tmp2t[1] + 1;
270
271 2519006 hpel[ 8]= src + stride;
272 2519006 hpel[ 9]= hpel[1] + 64;
273 2519006 hpel[10]= hpel[8] + 1;
274
275 #define MC_STRIDE(x) (needs[x] ? 64 : stride)
276
277
2/2
✓ Branch 0 taken 570104 times.
✓ Branch 1 taken 1948902 times.
2519006 if(b==15){
278 570104 int dxy = dx / 8 + dy / 8 * 4;
279 570104 const uint8_t *src1 = hpel[dxy ];
280 570104 const uint8_t *src2 = hpel[dxy + 1];
281 570104 const uint8_t *src3 = hpel[dxy + 4];
282 570104 const uint8_t *src4 = hpel[dxy + 5];
283
2/2
✓ Branch 0 taken 142836 times.
✓ Branch 1 taken 427268 times.
570104 int stride1 = MC_STRIDE(dxy);
284
2/2
✓ Branch 0 taken 142354 times.
✓ Branch 1 taken 427750 times.
570104 int stride2 = MC_STRIDE(dxy + 1);
285
2/2
✓ Branch 0 taken 140858 times.
✓ Branch 1 taken 429246 times.
570104 int stride3 = MC_STRIDE(dxy + 4);
286
2/2
✓ Branch 0 taken 144056 times.
✓ Branch 1 taken 426048 times.
570104 int stride4 = MC_STRIDE(dxy + 5);
287 570104 dx&=7;
288 570104 dy&=7;
289
2/2
✓ Branch 0 taken 2404024 times.
✓ Branch 1 taken 570104 times.
2974128 for(y=0; y < b_h; y++){
290
2/2
✓ Branch 0 taken 10796488 times.
✓ Branch 1 taken 2404024 times.
13200512 for(x=0; x < b_w; x++){
291 10796488 dst[x]= ((8-dx)*(8-dy)*src1[x] + dx*(8-dy)*src2[x]+
292 10796488 (8-dx)* dy *src3[x] + dx* dy *src4[x]+32)>>6;
293 }
294 2404024 src1+=stride1;
295 2404024 src2+=stride2;
296 2404024 src3+=stride3;
297 2404024 src4+=stride4;
298 2404024 dst +=stride;
299 }
300 }else{
301 1948902 const uint8_t *src1= hpel[l];
302 1948902 const uint8_t *src2= hpel[r];
303
2/2
✓ Branch 0 taken 470498 times.
✓ Branch 1 taken 1478404 times.
1948902 int stride1 = MC_STRIDE(l);
304
2/2
✓ Branch 0 taken 514208 times.
✓ Branch 1 taken 1434694 times.
1948902 int stride2 = MC_STRIDE(r);
305 1948902 int a= weight[((dx&7) + (8*(dy&7)))];
306 1948902 int b= 8-a;
307
2/2
✓ Branch 0 taken 8355700 times.
✓ Branch 1 taken 1948902 times.
10304602 for(y=0; y < b_h; y++){
308
2/2
✓ Branch 0 taken 40438896 times.
✓ Branch 1 taken 8355700 times.
48794596 for(x=0; x < b_w; x++){
309 40438896 dst[x]= (a*src1[x] + b*src2[x] + 4)>>3;
310 }
311 8355700 src1+=stride1;
312 8355700 src2+=stride2;
313 8355700 dst +=stride;
314 }
315 }
316 2519006 }
317
318 6691595 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){
319
2/2
✓ Branch 0 taken 249159 times.
✓ Branch 1 taken 6442436 times.
6691595 if(block->type & BLOCK_INTRA){
320 int x, y;
321 249159 const unsigned color = block->color[plane_index];
322 249159 const unsigned color4 = color*0x01010101;
323
2/2
✓ Branch 0 taken 18870 times.
✓ Branch 1 taken 230289 times.
249159 if(b_w==32){
324
2/2
✓ Branch 0 taken 603840 times.
✓ Branch 1 taken 18870 times.
622710 for(y=0; y < b_h; y++){
325 603840 *(uint32_t*)&dst[0 + y*stride]= color4;
326 603840 *(uint32_t*)&dst[4 + y*stride]= color4;
327 603840 *(uint32_t*)&dst[8 + y*stride]= color4;
328 603840 *(uint32_t*)&dst[12+ y*stride]= color4;
329 603840 *(uint32_t*)&dst[16+ y*stride]= color4;
330 603840 *(uint32_t*)&dst[20+ y*stride]= color4;
331 603840 *(uint32_t*)&dst[24+ y*stride]= color4;
332 603840 *(uint32_t*)&dst[28+ y*stride]= color4;
333 }
334
2/2
✓ Branch 0 taken 68524 times.
✓ Branch 1 taken 161765 times.
230289 }else if(b_w==16){
335
2/2
✓ Branch 0 taken 971512 times.
✓ Branch 1 taken 68524 times.
1040036 for(y=0; y < b_h; y++){
336 971512 *(uint32_t*)&dst[0 + y*stride]= color4;
337 971512 *(uint32_t*)&dst[4 + y*stride]= color4;
338 971512 *(uint32_t*)&dst[8 + y*stride]= color4;
339 971512 *(uint32_t*)&dst[12+ y*stride]= color4;
340 }
341
2/2
✓ Branch 0 taken 145281 times.
✓ Branch 1 taken 16484 times.
161765 }else if(b_w==8){
342
2/2
✓ Branch 0 taken 1088064 times.
✓ Branch 1 taken 145281 times.
1233345 for(y=0; y < b_h; y++){
343 1088064 *(uint32_t*)&dst[0 + y*stride]= color4;
344 1088064 *(uint32_t*)&dst[4 + y*stride]= color4;
345 }
346
2/2
✓ Branch 0 taken 16472 times.
✓ Branch 1 taken 12 times.
16484 }else if(b_w==4){
347
2/2
✓ Branch 0 taken 116600 times.
✓ Branch 1 taken 16472 times.
133072 for(y=0; y < b_h; y++){
348 116600 *(uint32_t*)&dst[0 + y*stride]= color4;
349 }
350 }else{
351
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 12 times.
60 for(y=0; y < b_h; y++){
352
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 48 times.
144 for(x=0; x < b_w; x++){
353 96 dst[x + y*stride]= color;
354 }
355 }
356 }
357 }else{
358 6442436 uint8_t *src= s->last_picture[block->ref]->data[plane_index];
359
2/2
✓ Branch 0 taken 4096652 times.
✓ Branch 1 taken 2345784 times.
6442436 const int scale= plane_index ? (2*s->mv_scale)>>s->chroma_h_shift : 2*s->mv_scale;
360 6442436 int mx= block->mx*scale;
361 6442436 int my= block->my*scale;
362 6442436 const int dx= mx&15;
363 6442436 const int dy= my&15;
364 6442436 const int tab_index= 3 - (b_w>>2) + (b_w>>4);
365 6442436 sx += (mx>>4) - (HTAPS_MAX/2-1);
366 6442436 sy += (my>>4) - (HTAPS_MAX/2-1);
367 6442436 src += sx + sy*stride;
368
3/4
✓ Branch 0 taken 6442436 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5977739 times.
✓ Branch 3 taken 464697 times.
6442436 if( (unsigned)sx >= FFMAX(w - b_w - (HTAPS_MAX-2), 0)
369
3/4
✓ Branch 0 taken 5977739 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 592951 times.
✓ Branch 3 taken 5384788 times.
5977739 || (unsigned)sy >= FFMAX(h - b_h - (HTAPS_MAX-2), 0)){
370 1057648 s->vdsp.emulated_edge_mc(tmp + MB_SIZE, src,
371 stride, stride,
372 b_w+HTAPS_MAX-1, b_h+HTAPS_MAX-1,
373 sx, sy, w, h);
374 1057648 src= tmp + MB_SIZE;
375 }
376
377 av_assert2(s->chroma_h_shift == s->chroma_v_shift); // only one mv_scale
378
379 av_assert2((tab_index>=0 && tab_index<4) || b_w==32);
380
4/4
✓ Branch 0 taken 4768780 times.
✓ Branch 1 taken 1673656 times.
✓ Branch 2 taken 3943688 times.
✓ Branch 3 taken 825092 times.
6442436 if( (dx&3) || (dy&3)
381
5/6
✓ Branch 0 taken 308629 times.
✓ Branch 1 taken 3635059 times.
✓ Branch 2 taken 185691 times.
✓ Branch 3 taken 122938 times.
✓ Branch 4 taken 185691 times.
✗ Branch 5 not taken.
3943688 || !(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h)
382
1/2
✓ Branch 0 taken 3943688 times.
✗ Branch 1 not taken.
3943688 || (b_w&(b_w-1))
383
1/2
✓ Branch 0 taken 3943688 times.
✗ Branch 1 not taken.
3943688 || b_w == 1
384
1/2
✓ Branch 0 taken 3943688 times.
✗ Branch 1 not taken.
3943688 || b_h == 1
385
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3943688 times.
3943688 || !s->plane[plane_index].fast_mc )
386 2498748 mc_block(&s->plane[plane_index], dst, src, stride, b_w, b_h, dx, dy);
387
2/2
✓ Branch 0 taken 297458 times.
✓ Branch 1 taken 3646230 times.
3943688 else if(b_w==32){
388 int y;
389
2/2
✓ Branch 0 taken 594916 times.
✓ Branch 1 taken 297458 times.
892374 for(y=0; y<b_h; y+=16){
390 594916 s->h264qpel.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 3 + (y+3)*stride,stride);
391 594916 s->h264qpel.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 19 + (y+3)*stride,stride);
392 }
393
2/2
✓ Branch 0 taken 3337601 times.
✓ Branch 1 taken 308629 times.
3646230 }else if(b_w==b_h)
394 3337601 s->h264qpel.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 3 + 3*stride,stride);
395
2/2
✓ Branch 0 taken 185691 times.
✓ Branch 1 taken 122938 times.
308629 else if(b_w==2*b_h){
396 185691 s->h264qpel.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 3 + 3*stride,stride);
397 185691 s->h264qpel.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 3 + b_h + 3*stride,stride);
398 }else{
399 av_assert2(2*b_w==b_h);
400 122938 s->h264qpel.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 3 + 3*stride ,stride);
401 122938 s->h264qpel.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 3 + 3*stride+b_w*stride,stride);
402 }
403 }
404 6691595 }
405
406 #define mca(dx,dy,b_w)\
407 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int h){\
408 av_assert2(h==b_w);\
409 mc_block(NULL, dst, src-(HTAPS_MAX/2-1)-(HTAPS_MAX/2-1)*stride, stride, b_w, b_w, dx, dy);\
410 }
411
412 mca( 0, 0,16)
413 5509 mca( 8, 0,16)
414 4983 mca( 0, 8,16)
415 9766 mca( 8, 8,16)
416 mca( 0, 0,8)
417 mca( 8, 0,8)
418 mca( 0, 8,8)
419 mca( 8, 8,8)
420
421 20 static av_cold void snow_static_init(void)
422 {
423
2/2
✓ Branch 0 taken 160 times.
✓ Branch 1 taken 20 times.
180 for (int i = 0; i < MAX_REF_FRAMES; i++)
424
2/2
✓ Branch 0 taken 1280 times.
✓ Branch 1 taken 160 times.
1440 for (int j = 0; j < MAX_REF_FRAMES; j++)
425 1280 ff_scale_mv_ref[i][j] = 256 * (i + 1) / (j + 1);
426 20 }
427
428 29 av_cold int ff_snow_common_init(AVCodecContext *avctx){
429 static AVOnce init_static_once = AV_ONCE_INIT;
430 29 SnowContext *s = avctx->priv_data;
431 int width, height;
432 int i;
433
434 29 s->avctx= avctx;
435 29 s->max_ref_frames=1; //just make sure it's not an invalid value in case of no initial keyframe
436 29 s->spatial_decomposition_count = 1;
437
438 29 ff_me_cmp_init(&s->mecc, avctx);
439 29 ff_hpeldsp_init(&s->hdsp, avctx->flags);
440 29 ff_videodsp_init(&s->vdsp, 8);
441 29 ff_dwt_init(&s->dwt);
442 29 ff_h264qpel_init(&s->h264qpel, 8);
443
444 #define mcf(dx,dy)\
445 s->qdsp.put_qpel_pixels_tab [0][dy+dx/4]=\
446 s->qdsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
447 s->h264qpel.put_h264_qpel_pixels_tab[0][dy+dx/4];\
448 s->qdsp.put_qpel_pixels_tab [1][dy+dx/4]=\
449 s->qdsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
450 s->h264qpel.put_h264_qpel_pixels_tab[1][dy+dx/4];
451
452 29 mcf( 0, 0)
453 29 mcf( 4, 0)
454 29 mcf( 8, 0)
455 29 mcf(12, 0)
456 29 mcf( 0, 4)
457 29 mcf( 4, 4)
458 29 mcf( 8, 4)
459 29 mcf(12, 4)
460 29 mcf( 0, 8)
461 29 mcf( 4, 8)
462 29 mcf( 8, 8)
463 29 mcf(12, 8)
464 29 mcf( 0,12)
465 29 mcf( 4,12)
466 29 mcf( 8,12)
467 29 mcf(12,12)
468
469 #define mcfh(dx,dy)\
470 s->hdsp.put_pixels_tab [0][dy/4+dx/8]=\
471 s->hdsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\
472 mc_block_hpel ## dx ## dy ## 16;\
473 s->hdsp.put_pixels_tab [1][dy/4+dx/8]=\
474 s->hdsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\
475 mc_block_hpel ## dx ## dy ## 8;
476
477 29 mcfh(0, 0)
478 29 mcfh(8, 0)
479 29 mcfh(0, 8)
480 29 mcfh(8, 8)
481
482 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift);
483
484 29 width= s->avctx->width;
485 29 height= s->avctx->height;
486
487
1/2
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
29 if (!FF_ALLOCZ_TYPED_ARRAY(s->spatial_idwt_buffer, width * height) ||
488
1/2
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
29 !FF_ALLOCZ_TYPED_ARRAY(s->spatial_dwt_buffer, width * height) || //FIXME this does not belong here
489
1/2
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
29 !FF_ALLOCZ_TYPED_ARRAY(s->temp_dwt_buffer, width) ||
490
1/2
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
29 !FF_ALLOCZ_TYPED_ARRAY(s->temp_idwt_buffer, width) ||
491
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 29 times.
29 !FF_ALLOCZ_TYPED_ARRAY(s->run_buffer, ((width + 1) >> 1) * ((height + 1) >> 1)))
492 return AVERROR(ENOMEM);
493
494
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 29 times.
261 for(i=0; i<MAX_REF_FRAMES; i++) {
495 232 s->last_picture[i] = av_frame_alloc();
496
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 232 times.
232 if (!s->last_picture[i])
497 return AVERROR(ENOMEM);
498 }
499
500 29 s->mconly_picture = av_frame_alloc();
501 29 s->current_picture = av_frame_alloc();
502
2/4
✓ Branch 0 taken 29 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 29 times.
29 if (!s->mconly_picture || !s->current_picture)
503 return AVERROR(ENOMEM);
504
505 29 ff_thread_once(&init_static_once, snow_static_init);
506
507 29 return 0;
508 }
509
510 911 int ff_snow_common_init_after_header(AVCodecContext *avctx) {
511 911 SnowContext *s = avctx->priv_data;
512 int plane_index, level, orientation;
513 int ret, emu_buf_size;
514
515
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 882 times.
911 if(!s->scratchbuf) {
516
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 29 times.
29 if ((ret = ff_get_buffer(s->avctx, s->mconly_picture,
517 AV_GET_BUFFER_FLAG_REF)) < 0)
518 return ret;
519 29 emu_buf_size = FFMAX(s->mconly_picture->linesize[0], 2*avctx->width+256) * (2 * MB_SIZE + HTAPS_MAX - 1);
520
1/2
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
29 if (!FF_ALLOCZ_TYPED_ARRAY(s->scratchbuf, FFMAX(s->mconly_picture->linesize[0], 2*avctx->width+256) * 7 * MB_SIZE) ||
521
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 29 times.
29 !FF_ALLOCZ_TYPED_ARRAY(s->emu_edge_buffer, emu_buf_size))
522 return AVERROR(ENOMEM);
523 }
524
525
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 911 times.
911 if(s->mconly_picture->format != avctx->pix_fmt) {
526 av_log(avctx, AV_LOG_ERROR, "pixel format changed\n");
527 return AVERROR_INVALIDDATA;
528 }
529
530
2/2
✓ Branch 0 taken 2733 times.
✓ Branch 1 taken 911 times.
3644 for(plane_index=0; plane_index < s->nb_planes; plane_index++){
531 2733 int w= s->avctx->width;
532 2733 int h= s->avctx->height;
533
534
2/2
✓ Branch 0 taken 1822 times.
✓ Branch 1 taken 911 times.
2733 if(plane_index){
535 1822 w = AV_CEIL_RSHIFT(w, s->chroma_h_shift);
536 1822 h = AV_CEIL_RSHIFT(h, s->chroma_v_shift);
537 }
538 2733 s->plane[plane_index].width = w;
539 2733 s->plane[plane_index].height= h;
540
541
2/2
✓ Branch 0 taken 13665 times.
✓ Branch 1 taken 2733 times.
16398 for(level=s->spatial_decomposition_count-1; level>=0; level--){
542
2/2
✓ Branch 0 taken 43728 times.
✓ Branch 1 taken 13665 times.
57393 for(orientation=level ? 1 : 0; orientation<4; orientation++){
543 43728 SubBand *b= &s->plane[plane_index].band[level][orientation];
544
545 43728 b->buf= s->spatial_dwt_buffer;
546 43728 b->level= level;
547 43728 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level);
548 43728 b->width = (w + !(orientation&1))>>1;
549 43728 b->height= (h + !(orientation>1))>>1;
550
551 43728 b->stride_line = 1 << (s->spatial_decomposition_count - level);
552 43728 b->buf_x_offset = 0;
553 43728 b->buf_y_offset = 0;
554
555
2/2
✓ Branch 0 taken 27330 times.
✓ Branch 1 taken 16398 times.
43728 if(orientation&1){
556 27330 b->buf += (w+1)>>1;
557 27330 b->buf_x_offset = (w+1)>>1;
558 }
559
2/2
✓ Branch 0 taken 27330 times.
✓ Branch 1 taken 16398 times.
43728 if(orientation>1){
560 27330 b->buf += b->stride>>1;
561 27330 b->buf_y_offset = b->stride_line >> 1;
562 }
563 43728 b->ibuf= s->spatial_idwt_buffer + (b->buf - s->spatial_dwt_buffer);
564
565
2/2
✓ Branch 0 taken 32796 times.
✓ Branch 1 taken 10932 times.
43728 if(level)
566 32796 b->parent= &s->plane[plane_index].band[level-1][orientation];
567 //FIXME avoid this realloc
568 43728 av_freep(&b->x_coeff);
569 43728 b->x_coeff = av_calloc((b->width + 1) * b->height + 1,
570 sizeof(*b->x_coeff));
571
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 43728 times.
43728 if (!b->x_coeff)
572 return AVERROR(ENOMEM);
573 }
574 13665 w= (w+1)>>1;
575 13665 h= (h+1)>>1;
576 }
577 }
578
579 911 return 0;
580 }
581
582 #define USE_HALFPEL_PLANE 0
583
584 static int halfpel_interpol(SnowContext *s, uint8_t *halfpel[4][4], AVFrame *frame){
585 int p,x,y;
586
587 for(p=0; p < s->nb_planes; p++){
588 int is_chroma= !!p;
589 int w= is_chroma ? AV_CEIL_RSHIFT(s->avctx->width, s->chroma_h_shift) : s->avctx->width;
590 int h= is_chroma ? AV_CEIL_RSHIFT(s->avctx->height, s->chroma_v_shift) : s->avctx->height;
591 int ls= frame->linesize[p];
592 uint8_t *src= frame->data[p];
593
594 halfpel[1][p] = av_malloc_array(ls, (h + 2 * EDGE_WIDTH));
595 halfpel[2][p] = av_malloc_array(ls, (h + 2 * EDGE_WIDTH));
596 halfpel[3][p] = av_malloc_array(ls, (h + 2 * EDGE_WIDTH));
597 if (!halfpel[1][p] || !halfpel[2][p] || !halfpel[3][p]) {
598 av_freep(&halfpel[1][p]);
599 av_freep(&halfpel[2][p]);
600 av_freep(&halfpel[3][p]);
601 return AVERROR(ENOMEM);
602 }
603 halfpel[1][p] += EDGE_WIDTH * (1 + ls);
604 halfpel[2][p] += EDGE_WIDTH * (1 + ls);
605 halfpel[3][p] += EDGE_WIDTH * (1 + ls);
606
607 halfpel[0][p]= src;
608 for(y=0; y<h; y++){
609 for(x=0; x<w; x++){
610 int i= y*ls + x;
611
612 halfpel[1][p][i]= (20*(src[i] + src[i+1]) - 5*(src[i-1] + src[i+2]) + (src[i-2] + src[i+3]) + 16 )>>5;
613 }
614 }
615 for(y=0; y<h; y++){
616 for(x=0; x<w; x++){
617 int i= y*ls + x;
618
619 halfpel[2][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
620 }
621 }
622 src= halfpel[1][p];
623 for(y=0; y<h; y++){
624 for(x=0; x<w; x++){
625 int i= y*ls + x;
626
627 halfpel[3][p][i]= (20*(src[i] + src[i+ls]) - 5*(src[i-ls] + src[i+2*ls]) + (src[i-2*ls] + src[i+3*ls]) + 16 )>>5;
628 }
629 }
630
631 //FIXME border!
632 }
633 return 0;
634 }
635
636 1822 void ff_snow_release_buffer(AVCodecContext *avctx)
637 {
638 1822 SnowContext *s = avctx->priv_data;
639 int i;
640
641
2/2
✓ Branch 0 taken 882 times.
✓ Branch 1 taken 940 times.
1822 if(s->last_picture[s->max_ref_frames-1]->data[0]){
642 882 av_frame_unref(s->last_picture[s->max_ref_frames-1]);
643
2/2
✓ Branch 0 taken 7938 times.
✓ Branch 1 taken 882 times.
8820 for(i=0; i<9; i++)
644
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7938 times.
7938 if(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3]) {
645 av_free(s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3] - EDGE_WIDTH*(1+s->current_picture->linesize[i%3]));
646 s->halfpel_plane[s->max_ref_frames-1][1+i/3][i%3] = NULL;
647 }
648 }
649 1822 }
650
651 911 int ff_snow_frame_start(SnowContext *s){
652 AVFrame *tmp;
653 int i, ret;
654
655 911 ff_snow_release_buffer(s->avctx);
656
657 911 tmp= s->last_picture[s->max_ref_frames-1];
658
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 911 times.
911 for(i=s->max_ref_frames-1; i>0; i--)
659 s->last_picture[i] = s->last_picture[i-1];
660 911 memmove(s->halfpel_plane+1, s->halfpel_plane, (s->max_ref_frames-1)*sizeof(void*)*4*4);
661 if(USE_HALFPEL_PLANE && s->current_picture->data[0]) {
662 if((ret = halfpel_interpol(s, s->halfpel_plane[0], s->current_picture)) < 0)
663 return ret;
664 }
665 911 s->last_picture[0] = s->current_picture;
666 911 s->current_picture = tmp;
667
668
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 810 times.
911 if(s->keyframe){
669 101 s->ref_frames= 0;
670 }else{
671 int i;
672
3/4
✓ Branch 0 taken 810 times.
✓ Branch 1 taken 810 times.
✓ Branch 2 taken 810 times.
✗ Branch 3 not taken.
1620 for(i=0; i<s->max_ref_frames && s->last_picture[i]->data[0]; i++)
673
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 810 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
810 if(i && s->last_picture[i-1]->key_frame)
674 break;
675 810 s->ref_frames= i;
676
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 810 times.
810 if(s->ref_frames==0){
677 av_log(s->avctx,AV_LOG_ERROR, "No reference frames\n");
678 return AVERROR_INVALIDDATA;
679 }
680 }
681
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 911 times.
911 if ((ret = ff_snow_get_buffer(s, s->current_picture)) < 0)
682 return ret;
683
684 911 s->current_picture->key_frame= s->keyframe;
685
686 911 return 0;
687 }
688
689 29 av_cold void ff_snow_common_end(SnowContext *s)
690 {
691 int plane_index, level, orientation, i;
692
693 29 av_freep(&s->spatial_dwt_buffer);
694 29 av_freep(&s->temp_dwt_buffer);
695 29 av_freep(&s->spatial_idwt_buffer);
696 29 av_freep(&s->temp_idwt_buffer);
697 29 av_freep(&s->run_buffer);
698
699 29 s->m.me.temp= NULL;
700 29 av_freep(&s->m.me.scratchpad);
701 29 av_freep(&s->m.me.map);
702 29 av_freep(&s->m.me.score_map);
703 29 av_freep(&s->m.sc.obmc_scratchpad);
704
705 29 av_freep(&s->block);
706 29 av_freep(&s->scratchbuf);
707 29 av_freep(&s->emu_edge_buffer);
708
709
2/2
✓ Branch 0 taken 232 times.
✓ Branch 1 taken 29 times.
261 for(i=0; i<MAX_REF_FRAMES; i++){
710 232 av_freep(&s->ref_mvs[i]);
711 232 av_freep(&s->ref_scores[i]);
712
2/4
✓ Branch 0 taken 232 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 232 times.
232 if(s->last_picture[i] && s->last_picture[i]->data[0]) {
713 av_assert0(s->last_picture[i]->data[0] != s->current_picture->data[0]);
714 }
715 232 av_frame_free(&s->last_picture[i]);
716 }
717
718
2/2
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 29 times.
145 for(plane_index=0; plane_index < MAX_PLANES; plane_index++){
719
2/2
✓ Branch 0 taken 928 times.
✓ Branch 1 taken 116 times.
1044 for(level=MAX_DECOMPOSITIONS-1; level>=0; level--){
720
2/2
✓ Branch 0 taken 2900 times.
✓ Branch 1 taken 928 times.
3828 for(orientation=level ? 1 : 0; orientation<4; orientation++){
721 2900 SubBand *b= &s->plane[plane_index].band[level][orientation];
722
723 2900 av_freep(&b->x_coeff);
724 }
725 }
726 }
727 29 av_frame_free(&s->mconly_picture);
728 29 av_frame_free(&s->current_picture);
729 29 }
730