FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/snow.c
Date: 2022-07-04 00:18:54
Exec Total Coverage
Lines: 380 443 85.8%
Branches: 198 262 75.6%

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