FFmpeg coverage


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