Directory: | ../../../ffmpeg/ |
---|---|
File: | src/libavcodec/h264_loopfilter.c |
Date: | 2022-07-05 19:52:29 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 385 | 436 | 88.3% |
Branches: | 325 | 388 | 83.8% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * H.26L/H.264/AVC/JVT/14496-10/... loop filter | ||
3 | * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | ||
4 | * | ||
5 | * This file is part of FFmpeg. | ||
6 | * | ||
7 | * FFmpeg is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU Lesser General Public | ||
9 | * License as published by the Free Software Foundation; either | ||
10 | * version 2.1 of the License, or (at your option) any later version. | ||
11 | * | ||
12 | * FFmpeg is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * Lesser General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public | ||
18 | * License along with FFmpeg; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | /** | ||
23 | * @file | ||
24 | * H.264 / AVC / MPEG-4 part10 loop filter. | ||
25 | * @author Michael Niedermayer <michaelni@gmx.at> | ||
26 | */ | ||
27 | |||
28 | #include "libavutil/internal.h" | ||
29 | #include "libavutil/intreadwrite.h" | ||
30 | #include "libavutil/mem_internal.h" | ||
31 | #include "avcodec.h" | ||
32 | #include "h264dec.h" | ||
33 | #include "h264_ps.h" | ||
34 | #include "mpegutils.h" | ||
35 | |||
36 | /* Deblocking filter (p153) */ | ||
37 | static const uint8_t alpha_table[52*3] = { | ||
38 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
39 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
40 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
41 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
42 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
43 | 0, 0, 0, 0, 0, 0, 4, 4, 5, 6, | ||
44 | 7, 8, 9, 10, 12, 13, 15, 17, 20, 22, | ||
45 | 25, 28, 32, 36, 40, 45, 50, 56, 63, 71, | ||
46 | 80, 90,101,113,127,144,162,182,203,226, | ||
47 | 255,255, | ||
48 | 255,255,255,255,255,255,255,255,255,255,255,255,255, | ||
49 | 255,255,255,255,255,255,255,255,255,255,255,255,255, | ||
50 | 255,255,255,255,255,255,255,255,255,255,255,255,255, | ||
51 | 255,255,255,255,255,255,255,255,255,255,255,255,255, | ||
52 | }; | ||
53 | static const uint8_t beta_table[52*3] = { | ||
54 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
55 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
56 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
57 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
58 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
59 | 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, | ||
60 | 3, 3, 3, 4, 4, 4, 6, 6, 7, 7, | ||
61 | 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, | ||
62 | 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, | ||
63 | 18, 18, | ||
64 | 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, | ||
65 | 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, | ||
66 | 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, | ||
67 | 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, | ||
68 | }; | ||
69 | static const uint8_t tc0_table[52*3][4] = { | ||
70 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
71 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
72 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
73 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
74 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
75 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
76 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
77 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
78 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
79 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
80 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, | ||
81 | {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 1 }, | ||
82 | {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 1, 1 }, {-1, 0, 1, 1 }, {-1, 1, 1, 1 }, | ||
83 | {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 }, | ||
84 | {-1, 1, 1, 2 }, {-1, 1, 2, 3 }, {-1, 1, 2, 3 }, {-1, 2, 2, 3 }, {-1, 2, 2, 4 }, {-1, 2, 3, 4 }, | ||
85 | {-1, 2, 3, 4 }, {-1, 3, 3, 5 }, {-1, 3, 4, 6 }, {-1, 3, 4, 6 }, {-1, 4, 5, 7 }, {-1, 4, 5, 8 }, | ||
86 | {-1, 4, 6, 9 }, {-1, 5, 7,10 }, {-1, 6, 8,11 }, {-1, 6, 8,13 }, {-1, 7,10,14 }, {-1, 8,11,16 }, | ||
87 | {-1, 9,12,18 }, {-1,10,13,20 }, {-1,11,15,23 }, {-1,13,17,25 }, | ||
88 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
89 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
90 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
91 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
92 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
93 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
94 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
95 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
96 | {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, | ||
97 | }; | ||
98 | |||
99 | /* intra: 0 if this loopfilter call is guaranteed to be inter (bS < 4), 1 if it might be intra (bS == 4) */ | ||
100 | 21505683 | static av_always_inline void filter_mb_edgev(uint8_t *pix, int stride, | |
101 | const int16_t bS[4], | ||
102 | unsigned int qp, int a, int b, | ||
103 | const H264Context *h, int intra) | ||
104 | { | ||
105 | 21505683 | const unsigned int index_a = qp + a; | |
106 | 21505683 | const int alpha = alpha_table[index_a]; | |
107 | 21505683 | const int beta = beta_table[qp + b]; | |
108 |
3/4✓ Branch 0 taken 21176022 times.
✓ Branch 1 taken 329661 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21176022 times.
|
21505683 | if (alpha ==0 || beta == 0) return; |
109 | |||
110 |
3/4✓ Branch 0 taken 2962081 times.
✓ Branch 1 taken 18213941 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2962081 times.
|
39389963 | if( bS[0] < 4 || !intra ) { |
111 | int8_t tc[4]; | ||
112 | 18213941 | tc[0] = tc0_table[index_a][bS[0]]; | |
113 | 18213941 | tc[1] = tc0_table[index_a][bS[1]]; | |
114 | 18213941 | tc[2] = tc0_table[index_a][bS[2]]; | |
115 | 18213941 | tc[3] = tc0_table[index_a][bS[3]]; | |
116 | 18213941 | h->h264dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc); | |
117 | } else { | ||
118 | 2962081 | h->h264dsp.h264_h_loop_filter_luma_intra(pix, stride, alpha, beta); | |
119 | } | ||
120 | } | ||
121 | |||
122 | 26012192 | static av_always_inline void filter_mb_edgecv(uint8_t *pix, int stride, | |
123 | const int16_t bS[4], | ||
124 | unsigned int qp, int a, int b, | ||
125 | const H264Context *h, int intra) | ||
126 | { | ||
127 | 26012192 | const unsigned int index_a = qp + a; | |
128 | 26012192 | const int alpha = alpha_table[index_a]; | |
129 | 26012192 | const int beta = beta_table[qp + b]; | |
130 |
3/4✓ Branch 0 taken 25436122 times.
✓ Branch 1 taken 576070 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 25436122 times.
|
26012192 | if (alpha ==0 || beta == 0) return; |
131 | |||
132 |
3/4✓ Branch 0 taken 5705683 times.
✓ Branch 1 taken 19730439 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5705683 times.
|
45166561 | if( bS[0] < 4 || !intra ) { |
133 | int8_t tc[4]; | ||
134 | 19730439 | tc[0] = tc0_table[index_a][bS[0]]+1; | |
135 | 19730439 | tc[1] = tc0_table[index_a][bS[1]]+1; | |
136 | 19730439 | tc[2] = tc0_table[index_a][bS[2]]+1; | |
137 | 19730439 | tc[3] = tc0_table[index_a][bS[3]]+1; | |
138 | 19730439 | h->h264dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc); | |
139 | } else { | ||
140 | 5705683 | h->h264dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta); | |
141 | } | ||
142 | } | ||
143 | |||
144 | 686076 | static av_always_inline void filter_mb_mbaff_edgev(const H264Context *h, uint8_t *pix, | |
145 | int stride, | ||
146 | const int16_t bS[7], int bsi, | ||
147 | int qp, int a, int b, | ||
148 | int intra) | ||
149 | { | ||
150 | 686076 | const unsigned int index_a = qp + a; | |
151 | 686076 | const int alpha = alpha_table[index_a]; | |
152 | 686076 | const int beta = beta_table[qp + b]; | |
153 |
3/4✓ Branch 0 taken 667837 times.
✓ Branch 1 taken 18239 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 667837 times.
|
686076 | if (alpha ==0 || beta == 0) return; |
154 | |||
155 |
3/4✓ Branch 0 taken 367925 times.
✓ Branch 1 taken 299912 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 367925 times.
|
967749 | if( bS[0] < 4 || !intra ) { |
156 | int8_t tc[4]; | ||
157 | 299912 | tc[0] = tc0_table[index_a][bS[0*bsi]]; | |
158 | 299912 | tc[1] = tc0_table[index_a][bS[1*bsi]]; | |
159 | 299912 | tc[2] = tc0_table[index_a][bS[2*bsi]]; | |
160 | 299912 | tc[3] = tc0_table[index_a][bS[3*bsi]]; | |
161 | 299912 | h->h264dsp.h264_h_loop_filter_luma_mbaff(pix, stride, alpha, beta, tc); | |
162 | } else { | ||
163 | 367925 | h->h264dsp.h264_h_loop_filter_luma_mbaff_intra(pix, stride, alpha, beta); | |
164 | } | ||
165 | } | ||
166 | |||
167 | 1372152 | static av_always_inline void filter_mb_mbaff_edgecv(const H264Context *h, | |
168 | uint8_t *pix, int stride, | ||
169 | const int16_t bS[7], | ||
170 | int bsi, int qp, int a, | ||
171 | int b, int intra) | ||
172 | { | ||
173 | 1372152 | const unsigned int index_a = qp + a; | |
174 | 1372152 | const int alpha = alpha_table[index_a]; | |
175 | 1372152 | const int beta = beta_table[qp + b]; | |
176 |
3/4✓ Branch 0 taken 1335082 times.
✓ Branch 1 taken 37070 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1335082 times.
|
1372152 | if (alpha ==0 || beta == 0) return; |
177 | |||
178 |
3/4✓ Branch 0 taken 735716 times.
✓ Branch 1 taken 599366 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 735716 times.
|
1934448 | if( bS[0] < 4 || !intra ) { |
179 | int8_t tc[4]; | ||
180 | 599366 | tc[0] = tc0_table[index_a][bS[0*bsi]] + 1; | |
181 | 599366 | tc[1] = tc0_table[index_a][bS[1*bsi]] + 1; | |
182 | 599366 | tc[2] = tc0_table[index_a][bS[2*bsi]] + 1; | |
183 | 599366 | tc[3] = tc0_table[index_a][bS[3*bsi]] + 1; | |
184 | 599366 | h->h264dsp.h264_h_loop_filter_chroma_mbaff(pix, stride, alpha, beta, tc); | |
185 | } else { | ||
186 | 735716 | h->h264dsp.h264_h_loop_filter_chroma_mbaff_intra(pix, stride, alpha, beta); | |
187 | } | ||
188 | } | ||
189 | |||
190 | 21750834 | static av_always_inline void filter_mb_edgeh(uint8_t *pix, int stride, | |
191 | const int16_t bS[4], | ||
192 | unsigned int qp, int a, int b, | ||
193 | const H264Context *h, int intra) | ||
194 | { | ||
195 | 21750834 | const unsigned int index_a = qp + a; | |
196 | 21750834 | const int alpha = alpha_table[index_a]; | |
197 | 21750834 | const int beta = beta_table[qp + b]; | |
198 |
3/4✓ Branch 0 taken 21414075 times.
✓ Branch 1 taken 336759 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21414075 times.
|
21750834 | if (alpha ==0 || beta == 0) return; |
199 | |||
200 |
3/4✓ Branch 0 taken 2360581 times.
✓ Branch 1 taken 19053494 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2360581 times.
|
40467569 | if( bS[0] < 4 || !intra ) { |
201 | int8_t tc[4]; | ||
202 | 19053494 | tc[0] = tc0_table[index_a][bS[0]]; | |
203 | 19053494 | tc[1] = tc0_table[index_a][bS[1]]; | |
204 | 19053494 | tc[2] = tc0_table[index_a][bS[2]]; | |
205 | 19053494 | tc[3] = tc0_table[index_a][bS[3]]; | |
206 | 19053494 | h->h264dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc); | |
207 | } else { | ||
208 | 2360581 | h->h264dsp.h264_v_loop_filter_luma_intra(pix, stride, alpha, beta); | |
209 | } | ||
210 | } | ||
211 | |||
212 | 29243978 | static av_always_inline void filter_mb_edgech(uint8_t *pix, int stride, | |
213 | const int16_t bS[4], | ||
214 | unsigned int qp, int a, int b, | ||
215 | const H264Context *h, int intra) | ||
216 | { | ||
217 | 29243978 | const unsigned int index_a = qp + a; | |
218 | 29243978 | const int alpha = alpha_table[index_a]; | |
219 | 29243978 | const int beta = beta_table[qp + b]; | |
220 |
3/4✓ Branch 0 taken 28663614 times.
✓ Branch 1 taken 580364 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 28663614 times.
|
29243978 | if (alpha ==0 || beta == 0) return; |
221 | |||
222 |
3/4✓ Branch 0 taken 4500616 times.
✓ Branch 1 taken 24162998 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4500616 times.
|
52826612 | if( bS[0] < 4 || !intra ) { |
223 | int8_t tc[4]; | ||
224 | 24162998 | tc[0] = tc0_table[index_a][bS[0]]+1; | |
225 | 24162998 | tc[1] = tc0_table[index_a][bS[1]]+1; | |
226 | 24162998 | tc[2] = tc0_table[index_a][bS[2]]+1; | |
227 | 24162998 | tc[3] = tc0_table[index_a][bS[3]]+1; | |
228 | 24162998 | h->h264dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc); | |
229 | } else { | ||
230 | 4500616 | h->h264dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta); | |
231 | } | ||
232 | } | ||
233 | |||
234 | 179535 | static av_always_inline void h264_filter_mb_fast_internal(const H264Context *h, | |
235 | H264SliceContext *sl, | ||
236 | int mb_x, int mb_y, | ||
237 | uint8_t *img_y, | ||
238 | uint8_t *img_cb, | ||
239 | uint8_t *img_cr, | ||
240 | unsigned int linesize, | ||
241 | unsigned int uvlinesize, | ||
242 | int pixel_shift) | ||
243 | { | ||
244 | 179535 | int chroma = CHROMA(h) && !(CONFIG_GRAY && (h->flags & AV_CODEC_FLAG_GRAY)); | |
245 | 179535 | int chroma444 = CHROMA444(h); | |
246 | 179535 | int chroma422 = CHROMA422(h); | |
247 | |||
248 | 179535 | int mb_xy = sl->mb_xy; | |
249 | 179535 | int left_type = sl->left_type[LTOP]; | |
250 | 179535 | int top_type = sl->top_type; | |
251 | |||
252 | 179535 | int qp_bd_offset = 6 * (h->ps.sps->bit_depth_luma - 8); | |
253 | 179535 | int a = 52 + sl->slice_alpha_c0_offset - qp_bd_offset; | |
254 | 179535 | int b = 52 + sl->slice_beta_offset - qp_bd_offset; | |
255 | |||
256 | 179535 | int mb_type = h->cur_pic.mb_type[mb_xy]; | |
257 | 179535 | int qp = h->cur_pic.qscale_table[mb_xy]; | |
258 | 179535 | int qp0 = h->cur_pic.qscale_table[mb_xy - 1]; | |
259 | 179535 | int qp1 = h->cur_pic.qscale_table[sl->top_mb_xy]; | |
260 | 179535 | int qpc = get_chroma_qp(h->ps.pps, 0, qp); | |
261 | 179535 | int qpc0 = get_chroma_qp(h->ps.pps, 0, qp0); | |
262 | 179535 | int qpc1 = get_chroma_qp(h->ps.pps, 0, qp1); | |
263 | 179535 | qp0 = (qp + qp0 + 1) >> 1; | |
264 | 179535 | qp1 = (qp + qp1 + 1) >> 1; | |
265 | 179535 | qpc0 = (qpc + qpc0 + 1) >> 1; | |
266 | 179535 | qpc1 = (qpc + qpc1 + 1) >> 1; | |
267 | |||
268 |
2/2✓ Branch 0 taken 13720 times.
✓ Branch 1 taken 165815 times.
|
179535 | if( IS_INTRA(mb_type) ) { |
269 | static const int16_t bS4[4] = {4,4,4,4}; | ||
270 | static const int16_t bS3[4] = {3,3,3,3}; | ||
271 |
2/2✓ Branch 0 taken 5118 times.
✓ Branch 1 taken 8602 times.
|
13720 | const int16_t *bSH = FIELD_PICTURE(h) ? bS3 : bS4; |
272 |
2/2✓ Branch 0 taken 13319 times.
✓ Branch 1 taken 401 times.
|
13720 | if(left_type) |
273 | 13319 | filter_mb_edgev( &img_y[4*0<<pixel_shift], linesize, bS4, qp0, a, b, h, 1); | |
274 |
2/2✓ Branch 0 taken 4971 times.
✓ Branch 1 taken 8749 times.
|
13720 | if( IS_8x8DCT(mb_type) ) { |
275 | 4971 | filter_mb_edgev( &img_y[4*2<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
276 |
2/2✓ Branch 0 taken 4933 times.
✓ Branch 1 taken 38 times.
|
4971 | if(top_type){ |
277 | 4933 | filter_mb_edgeh( &img_y[4*0*linesize], linesize, bSH, qp1, a, b, h, 1); | |
278 | } | ||
279 | 4971 | filter_mb_edgeh( &img_y[4*2*linesize], linesize, bS3, qp, a, b, h, 0); | |
280 | } else { | ||
281 | 8749 | filter_mb_edgev( &img_y[4*1<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
282 | 8749 | filter_mb_edgev( &img_y[4*2<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
283 | 8749 | filter_mb_edgev( &img_y[4*3<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
284 |
2/2✓ Branch 0 taken 8473 times.
✓ Branch 1 taken 276 times.
|
8749 | if(top_type){ |
285 | 8473 | filter_mb_edgeh( &img_y[4*0*linesize], linesize, bSH, qp1, a, b, h, 1); | |
286 | } | ||
287 | 8749 | filter_mb_edgeh( &img_y[4*1*linesize], linesize, bS3, qp, a, b, h, 0); | |
288 | 8749 | filter_mb_edgeh( &img_y[4*2*linesize], linesize, bS3, qp, a, b, h, 0); | |
289 | 8749 | filter_mb_edgeh( &img_y[4*3*linesize], linesize, bS3, qp, a, b, h, 0); | |
290 | } | ||
291 |
1/2✓ Branch 0 taken 13720 times.
✗ Branch 1 not taken.
|
13720 | if(chroma){ |
292 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13720 times.
|
13720 | if(chroma444){ |
293 | ✗ | if(left_type){ | |
294 | ✗ | filter_mb_edgev( &img_cb[4*0<<pixel_shift], linesize, bS4, qpc0, a, b, h, 1); | |
295 | ✗ | filter_mb_edgev( &img_cr[4*0<<pixel_shift], linesize, bS4, qpc0, a, b, h, 1); | |
296 | } | ||
297 | ✗ | if( IS_8x8DCT(mb_type) ) { | |
298 | ✗ | filter_mb_edgev( &img_cb[4*2<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
299 | ✗ | filter_mb_edgev( &img_cr[4*2<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
300 | ✗ | if(top_type){ | |
301 | ✗ | filter_mb_edgeh( &img_cb[4*0*linesize], linesize, bSH, qpc1, a, b, h, 1 ); | |
302 | ✗ | filter_mb_edgeh( &img_cr[4*0*linesize], linesize, bSH, qpc1, a, b, h, 1 ); | |
303 | } | ||
304 | ✗ | filter_mb_edgeh( &img_cb[4*2*linesize], linesize, bS3, qpc, a, b, h, 0); | |
305 | ✗ | filter_mb_edgeh( &img_cr[4*2*linesize], linesize, bS3, qpc, a, b, h, 0); | |
306 | } else { | ||
307 | ✗ | filter_mb_edgev( &img_cb[4*1<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
308 | ✗ | filter_mb_edgev( &img_cr[4*1<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
309 | ✗ | filter_mb_edgev( &img_cb[4*2<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
310 | ✗ | filter_mb_edgev( &img_cr[4*2<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
311 | ✗ | filter_mb_edgev( &img_cb[4*3<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
312 | ✗ | filter_mb_edgev( &img_cr[4*3<<pixel_shift], linesize, bS3, qpc, a, b, h, 0); | |
313 | ✗ | if(top_type){ | |
314 | ✗ | filter_mb_edgeh( &img_cb[4*0*linesize], linesize, bSH, qpc1, a, b, h, 1); | |
315 | ✗ | filter_mb_edgeh( &img_cr[4*0*linesize], linesize, bSH, qpc1, a, b, h, 1); | |
316 | } | ||
317 | ✗ | filter_mb_edgeh( &img_cb[4*1*linesize], linesize, bS3, qpc, a, b, h, 0); | |
318 | ✗ | filter_mb_edgeh( &img_cr[4*1*linesize], linesize, bS3, qpc, a, b, h, 0); | |
319 | ✗ | filter_mb_edgeh( &img_cb[4*2*linesize], linesize, bS3, qpc, a, b, h, 0); | |
320 | ✗ | filter_mb_edgeh( &img_cr[4*2*linesize], linesize, bS3, qpc, a, b, h, 0); | |
321 | ✗ | filter_mb_edgeh( &img_cb[4*3*linesize], linesize, bS3, qpc, a, b, h, 0); | |
322 | ✗ | filter_mb_edgeh( &img_cr[4*3*linesize], linesize, bS3, qpc, a, b, h, 0); | |
323 | } | ||
324 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13720 times.
|
13720 | }else if(chroma422){ |
325 | ✗ | if(left_type){ | |
326 | ✗ | filter_mb_edgecv(&img_cb[2*0<<pixel_shift], uvlinesize, bS4, qpc0, a, b, h, 1); | |
327 | ✗ | filter_mb_edgecv(&img_cr[2*0<<pixel_shift], uvlinesize, bS4, qpc0, a, b, h, 1); | |
328 | } | ||
329 | ✗ | filter_mb_edgecv(&img_cb[2*2<<pixel_shift], uvlinesize, bS3, qpc, a, b, h, 0); | |
330 | ✗ | filter_mb_edgecv(&img_cr[2*2<<pixel_shift], uvlinesize, bS3, qpc, a, b, h, 0); | |
331 | ✗ | if(top_type){ | |
332 | ✗ | filter_mb_edgech(&img_cb[4*0*uvlinesize], uvlinesize, bSH, qpc1, a, b, h, 1); | |
333 | ✗ | filter_mb_edgech(&img_cr[4*0*uvlinesize], uvlinesize, bSH, qpc1, a, b, h, 1); | |
334 | } | ||
335 | ✗ | filter_mb_edgech(&img_cb[4*1*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
336 | ✗ | filter_mb_edgech(&img_cr[4*1*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
337 | ✗ | filter_mb_edgech(&img_cb[4*2*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
338 | ✗ | filter_mb_edgech(&img_cr[4*2*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
339 | ✗ | filter_mb_edgech(&img_cb[4*3*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
340 | ✗ | filter_mb_edgech(&img_cr[4*3*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
341 | }else{ | ||
342 |
2/2✓ Branch 0 taken 13319 times.
✓ Branch 1 taken 401 times.
|
13720 | if(left_type){ |
343 | 13319 | filter_mb_edgecv( &img_cb[2*0<<pixel_shift], uvlinesize, bS4, qpc0, a, b, h, 1); | |
344 | 13319 | filter_mb_edgecv( &img_cr[2*0<<pixel_shift], uvlinesize, bS4, qpc0, a, b, h, 1); | |
345 | } | ||
346 | 13720 | filter_mb_edgecv( &img_cb[2*2<<pixel_shift], uvlinesize, bS3, qpc, a, b, h, 0); | |
347 | 13720 | filter_mb_edgecv( &img_cr[2*2<<pixel_shift], uvlinesize, bS3, qpc, a, b, h, 0); | |
348 |
2/2✓ Branch 0 taken 13406 times.
✓ Branch 1 taken 314 times.
|
13720 | if(top_type){ |
349 | 13406 | filter_mb_edgech( &img_cb[2*0*uvlinesize], uvlinesize, bSH, qpc1, a, b, h, 1); | |
350 | 13406 | filter_mb_edgech( &img_cr[2*0*uvlinesize], uvlinesize, bSH, qpc1, a, b, h, 1); | |
351 | } | ||
352 | 13720 | filter_mb_edgech( &img_cb[2*2*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
353 | 13720 | filter_mb_edgech( &img_cr[2*2*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
354 | } | ||
355 | } | ||
356 | 13720 | return; | |
357 | } else { | ||
358 | 165815 | LOCAL_ALIGNED(8, int16_t, bS, [2], [4][4]); | |
359 | int edges; | ||
360 |
5/6✓ Branch 0 taken 11813 times.
✓ Branch 1 taken 154002 times.
✓ Branch 2 taken 3569 times.
✓ Branch 3 taken 8244 times.
✓ Branch 4 taken 3569 times.
✗ Branch 5 not taken.
|
165815 | if( IS_8x8DCT(mb_type) && (sl->cbp&7) == 7 && !chroma444 ) { |
361 | 3569 | edges = 4; | |
362 | 3569 | AV_WN64A(bS[0][0], 0x0002000200020002ULL); | |
363 | 3569 | AV_WN64A(bS[0][2], 0x0002000200020002ULL); | |
364 | 3569 | AV_WN64A(bS[1][0], 0x0002000200020002ULL); | |
365 | 3569 | AV_WN64A(bS[1][2], 0x0002000200020002ULL); | |
366 | } else { | ||
367 | 162246 | int mask_edge1 = (3*(((5*mb_type)>>5)&1)) | (mb_type>>4); //(mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : (mb_type & MB_TYPE_16x8) ? 1 : 0; | |
368 | 162246 | int mask_edge0 = 3*((mask_edge1>>1) & ((5*left_type)>>5)&1); // (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) && (h->left_type[LTOP] & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : 0; | |
369 | 162246 | int step = 1+(mb_type>>24); //IS_8x8DCT(mb_type) ? 2 : 1; | |
370 | 162246 | edges = 4 - 3*((mb_type>>3) & !(sl->cbp & 15)); //(mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4; | |
371 | 162246 | h->h264dsp.h264_loop_filter_strength(bS, sl->non_zero_count_cache, sl->ref_cache, sl->mv_cache, | |
372 | 162246 | sl->list_count==2, edges, step, mask_edge0, mask_edge1, FIELD_PICTURE(h)); | |
373 | } | ||
374 |
2/2✓ Branch 0 taken 2256 times.
✓ Branch 1 taken 163559 times.
|
165815 | if( IS_INTRA(left_type) ) |
375 | 2256 | AV_WN64A(bS[0][0], 0x0004000400040004ULL); | |
376 |
2/2✓ Branch 0 taken 2444 times.
✓ Branch 1 taken 163371 times.
|
165815 | if( IS_INTRA(top_type) ) |
377 |
2/2✓ Branch 0 taken 540 times.
✓ Branch 1 taken 1904 times.
|
2444 | AV_WN64A(bS[1][0], FIELD_PICTURE(h) ? 0x0003000300030003ULL : 0x0004000400040004ULL); |
378 | |||
379 | #define FILTER(hv,dir,edge,intra)\ | ||
380 | if(AV_RN64A(bS[dir][edge])) { \ | ||
381 | filter_mb_edge##hv( &img_y[4*edge*(dir?linesize:1<<pixel_shift)], linesize, bS[dir][edge], edge ? qp : qp##dir, a, b, h, intra );\ | ||
382 | if(chroma){\ | ||
383 | if(chroma444){\ | ||
384 | filter_mb_edge##hv( &img_cb[4*edge*(dir?linesize:1<<pixel_shift)], linesize, bS[dir][edge], edge ? qpc : qpc##dir, a, b, h, intra );\ | ||
385 | filter_mb_edge##hv( &img_cr[4*edge*(dir?linesize:1<<pixel_shift)], linesize, bS[dir][edge], edge ? qpc : qpc##dir, a, b, h, intra );\ | ||
386 | } else if(!(edge&1)) {\ | ||
387 | filter_mb_edgec##hv( &img_cb[2*edge*(dir?uvlinesize:1<<pixel_shift)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir, a, b, h, intra );\ | ||
388 | filter_mb_edgec##hv( &img_cr[2*edge*(dir?uvlinesize:1<<pixel_shift)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir, a, b, h, intra );\ | ||
389 | }\ | ||
390 | }\ | ||
391 | } | ||
392 |
2/2✓ Branch 0 taken 162441 times.
✓ Branch 1 taken 3374 times.
|
165815 | if(left_type) |
393 |
4/6✓ Branch 0 taken 39036 times.
✓ Branch 1 taken 123405 times.
✓ Branch 3 taken 39036 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 39036 times.
|
162441 | FILTER(v,0,0,1); |
394 |
2/2✓ Branch 0 taken 138127 times.
✓ Branch 1 taken 27688 times.
|
165815 | if( edges == 1 ) { |
395 |
2/2✓ Branch 0 taken 135627 times.
✓ Branch 1 taken 2500 times.
|
138127 | if(top_type) |
396 |
4/6✓ Branch 0 taken 17056 times.
✓ Branch 1 taken 118571 times.
✓ Branch 3 taken 17056 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 17056 times.
|
135627 | FILTER(h,1,0,1); |
397 |
2/2✓ Branch 0 taken 11813 times.
✓ Branch 1 taken 15875 times.
|
27688 | } else if( IS_8x8DCT(mb_type) ) { |
398 |
3/6✓ Branch 0 taken 11813 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 11813 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 11813 times.
|
11813 | FILTER(v,0,2,0); |
399 |
2/2✓ Branch 0 taken 11755 times.
✓ Branch 1 taken 58 times.
|
11813 | if(top_type) |
400 |
4/6✓ Branch 0 taken 10613 times.
✓ Branch 1 taken 1142 times.
✓ Branch 3 taken 10613 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10613 times.
|
11755 | FILTER(h,1,0,1); |
401 |
3/6✓ Branch 0 taken 11813 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 11813 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 11813 times.
|
11813 | FILTER(h,1,2,0); |
402 | } else { | ||
403 |
4/6✓ Branch 0 taken 10214 times.
✓ Branch 1 taken 5661 times.
✓ Branch 3 taken 10214 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10214 times.
|
15875 | FILTER(v,0,1,0); |
404 |
4/6✓ Branch 0 taken 12041 times.
✓ Branch 1 taken 3834 times.
✓ Branch 3 taken 12041 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 12041 times.
|
15875 | FILTER(v,0,2,0); |
405 |
4/6✓ Branch 0 taken 10071 times.
✓ Branch 1 taken 5804 times.
✓ Branch 3 taken 10071 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10071 times.
|
15875 | FILTER(v,0,3,0); |
406 |
2/2✓ Branch 0 taken 15364 times.
✓ Branch 1 taken 511 times.
|
15875 | if(top_type) |
407 |
4/6✓ Branch 0 taken 12447 times.
✓ Branch 1 taken 2917 times.
✓ Branch 3 taken 12447 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 12447 times.
|
15364 | FILTER(h,1,0,1); |
408 |
4/6✓ Branch 0 taken 9894 times.
✓ Branch 1 taken 5981 times.
✓ Branch 3 taken 9894 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 9894 times.
|
15875 | FILTER(h,1,1,0); |
409 |
4/6✓ Branch 0 taken 12038 times.
✓ Branch 1 taken 3837 times.
✓ Branch 3 taken 12038 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 12038 times.
|
15875 | FILTER(h,1,2,0); |
410 |
4/6✓ Branch 0 taken 10234 times.
✓ Branch 1 taken 5641 times.
✓ Branch 3 taken 10234 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10234 times.
|
15875 | FILTER(h,1,3,0); |
411 | } | ||
412 | #undef FILTER | ||
413 | } | ||
414 | } | ||
415 | |||
416 | 8852335 | void ff_h264_filter_mb_fast(const H264Context *h, H264SliceContext *sl, | |
417 | int mb_x, int mb_y, uint8_t *img_y, | ||
418 | uint8_t *img_cb, uint8_t *img_cr, | ||
419 | unsigned int linesize, unsigned int uvlinesize) | ||
420 | { | ||
421 | av_assert2(!FRAME_MBAFF(h)); | ||
422 |
4/4✓ Branch 0 taken 179931 times.
✓ Branch 1 taken 8672404 times.
✓ Branch 2 taken 396 times.
✓ Branch 3 taken 179535 times.
|
8852335 | if(!h->h264dsp.h264_loop_filter_strength || h->ps.pps->chroma_qp_diff) { |
423 | 8672800 | ff_h264_filter_mb(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize); | |
424 | 8672800 | return; | |
425 | } | ||
426 | |||
427 | #if CONFIG_SMALL | ||
428 | h264_filter_mb_fast_internal(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, h->pixel_shift); | ||
429 | #else | ||
430 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 179535 times.
|
179535 | if(h->pixel_shift){ |
431 | ✗ | h264_filter_mb_fast_internal(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, 1); | |
432 | }else{ | ||
433 | 179535 | h264_filter_mb_fast_internal(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, 0); | |
434 | } | ||
435 | #endif | ||
436 | } | ||
437 | |||
438 | 29935805 | static int check_mv(H264SliceContext *sl, long b_idx, long bn_idx, int mvy_limit) | |
439 | { | ||
440 | int v; | ||
441 | |||
442 | 29935805 | v = sl->ref_cache[0][b_idx] != sl->ref_cache[0][bn_idx]; | |
443 |
4/4✓ Branch 0 taken 25415069 times.
✓ Branch 1 taken 4520736 times.
✓ Branch 2 taken 24039275 times.
✓ Branch 3 taken 1375794 times.
|
29935805 | if (!v && sl->ref_cache[0][b_idx] != -1) |
444 | 24039275 | v = sl->mv_cache[0][b_idx][0] - sl->mv_cache[0][bn_idx][0] + 3 >= 7U | | |
445 | 24039275 | FFABS(sl->mv_cache[0][b_idx][1] - sl->mv_cache[0][bn_idx][1]) >= mvy_limit; | |
446 | |||
447 |
2/2✓ Branch 0 taken 15280676 times.
✓ Branch 1 taken 14655129 times.
|
29935805 | if (sl->list_count == 2) { |
448 |
2/2✓ Branch 0 taken 11956660 times.
✓ Branch 1 taken 3324016 times.
|
15280676 | if(!v) |
449 | 11956660 | v = sl->ref_cache[1][b_idx] != sl->ref_cache[1][bn_idx] | | |
450 | 11956660 | sl->mv_cache[1][b_idx][0] - sl->mv_cache[1][bn_idx][0] + 3 >= 7U | | |
451 | 11956660 | FFABS(sl->mv_cache[1][b_idx][1] - sl->mv_cache[1][bn_idx][1]) >= mvy_limit; | |
452 | |||
453 |
2/2✓ Branch 0 taken 4765805 times.
✓ Branch 1 taken 10514871 times.
|
15280676 | if(v){ |
454 | 4765805 | if (sl->ref_cache[0][b_idx] != sl->ref_cache[1][bn_idx] | | |
455 |
2/2✓ Branch 0 taken 4408887 times.
✓ Branch 1 taken 356918 times.
|
4765805 | sl->ref_cache[1][b_idx] != sl->ref_cache[0][bn_idx]) |
456 | 4408887 | return 1; | |
457 | return | ||
458 | 356918 | sl->mv_cache[0][b_idx][0] - sl->mv_cache[1][bn_idx][0] + 3 >= 7U | | |
459 | 356918 | FFABS(sl->mv_cache[0][b_idx][1] - sl->mv_cache[1][bn_idx][1]) >= mvy_limit | | |
460 | 356918 | sl->mv_cache[1][b_idx][0] - sl->mv_cache[0][bn_idx][0] + 3 >= 7U | | |
461 | 356918 | FFABS(sl->mv_cache[1][b_idx][1] - sl->mv_cache[0][bn_idx][1]) >= mvy_limit; | |
462 | } | ||
463 | } | ||
464 | |||
465 | 25170000 | return v; | |
466 | } | ||
467 | |||
468 | 20562580 | static av_always_inline void filter_mb_dir(const H264Context *h, H264SliceContext *sl, | |
469 | int mb_x, int mb_y, | ||
470 | uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, | ||
471 | unsigned int linesize, unsigned int uvlinesize, | ||
472 | int mb_xy, int mb_type, int mvy_limit, | ||
473 | int first_vertical_edge_done, int a, int b, | ||
474 | int chroma, int dir) | ||
475 | { | ||
476 | int edge; | ||
477 | int chroma_qp_avg[2]; | ||
478 | 20562580 | int chroma444 = CHROMA444(h); | |
479 | 20562580 | int chroma422 = CHROMA422(h); | |
480 |
2/2✓ Branch 0 taken 10281290 times.
✓ Branch 1 taken 10281290 times.
|
20562580 | const int mbm_xy = dir == 0 ? mb_xy -1 : sl->top_mb_xy; |
481 |
2/2✓ Branch 0 taken 10281290 times.
✓ Branch 1 taken 10281290 times.
|
20562580 | const int mbm_type = dir == 0 ? sl->left_type[LTOP] : sl->top_type; |
482 | |||
483 | // how often to recheck mv-based bS when iterating between edges | ||
484 | static const uint8_t mask_edge_tab[2][8]={{0,3,3,3,1,1,1,1}, | ||
485 | {0,3,1,1,3,3,3,3}}; | ||
486 | 20562580 | const int mask_edge = mask_edge_tab[dir][(mb_type>>3)&7]; | |
487 |
4/4✓ Branch 0 taken 11656783 times.
✓ Branch 1 taken 8905797 times.
✓ Branch 2 taken 6908442 times.
✓ Branch 3 taken 4748341 times.
|
20562580 | const int edges = mask_edge== 3 && !(sl->cbp&15) ? 1 : 4; |
488 | |||
489 | // how often to recheck mv-based bS when iterating along each edge | ||
490 | 20562580 | const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)); | |
491 | |||
492 |
4/4✓ Branch 0 taken 19744287 times.
✓ Branch 1 taken 818293 times.
✓ Branch 2 taken 19401249 times.
✓ Branch 3 taken 343038 times.
|
20562580 | if(mbm_type && !first_vertical_edge_done){ |
493 | |||
494 |
6/6✓ Branch 0 taken 2734717 times.
✓ Branch 1 taken 16666532 times.
✓ Branch 2 taken 1508154 times.
✓ Branch 3 taken 1226563 times.
✓ Branch 4 taken 718622 times.
✓ Branch 5 taken 789532 times.
|
19401249 | if (FRAME_MBAFF(h) && (dir == 1) && ((mb_y&1) == 0) |
495 |
2/2✓ Branch 0 taken 91625 times.
✓ Branch 1 taken 626997 times.
|
718622 | && IS_INTERLACED(mbm_type&~mb_type) |
496 | 91625 | ) { | |
497 | // This is a special case in the norm where the filtering must | ||
498 | // be done twice (one each of the field) even if we are in a | ||
499 | // frame macroblock. | ||
500 | // | ||
501 | 91625 | unsigned int tmp_linesize = 2 * linesize; | |
502 | 91625 | unsigned int tmp_uvlinesize = 2 * uvlinesize; | |
503 | 91625 | int mbn_xy = mb_xy - 2 * h->mb_stride; | |
504 | int j; | ||
505 | |||
506 |
2/2✓ Branch 0 taken 183250 times.
✓ Branch 1 taken 91625 times.
|
274875 | for(j=0; j<2; j++, mbn_xy += h->mb_stride){ |
507 | 183250 | LOCAL_ALIGNED(8, int16_t, bS, [4]); | |
508 | int qp; | ||
509 |
2/2✓ Branch 0 taken 101718 times.
✓ Branch 1 taken 81532 times.
|
183250 | if (IS_INTRA(mb_type | h->cur_pic.mb_type[mbn_xy])) { |
510 | 101718 | AV_WN64A(bS, 0x0003000300030003ULL); | |
511 | } else { | ||
512 |
4/4✓ Branch 0 taken 12308 times.
✓ Branch 1 taken 69224 times.
✓ Branch 2 taken 924 times.
✓ Branch 3 taken 11384 times.
|
81532 | if (!CABAC(h) && IS_8x8DCT(h->cur_pic.mb_type[mbn_xy])) { |
513 |
4/4✓ Branch 0 taken 91 times.
✓ Branch 1 taken 833 times.
✓ Branch 2 taken 34 times.
✓ Branch 3 taken 57 times.
|
924 | bS[0]= 1+((h->cbp_table[mbn_xy] & 0x4000) || sl->non_zero_count_cache[scan8[0]+0]); |
514 |
4/4✓ Branch 0 taken 91 times.
✓ Branch 1 taken 833 times.
✓ Branch 2 taken 34 times.
✓ Branch 3 taken 57 times.
|
924 | bS[1]= 1+((h->cbp_table[mbn_xy] & 0x4000) || sl->non_zero_count_cache[scan8[0]+1]); |
515 |
4/4✓ Branch 0 taken 87 times.
✓ Branch 1 taken 837 times.
✓ Branch 2 taken 34 times.
✓ Branch 3 taken 53 times.
|
924 | bS[2]= 1+((h->cbp_table[mbn_xy] & 0x8000) || sl->non_zero_count_cache[scan8[0]+2]); |
516 |
4/4✓ Branch 0 taken 87 times.
✓ Branch 1 taken 837 times.
✓ Branch 2 taken 34 times.
✓ Branch 3 taken 53 times.
|
924 | bS[3]= 1+((h->cbp_table[mbn_xy] & 0x8000) || sl->non_zero_count_cache[scan8[0]+3]); |
517 | }else{ | ||
518 | 80608 | const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy] + 3*4; | |
519 | int i; | ||
520 |
2/2✓ Branch 0 taken 322432 times.
✓ Branch 1 taken 80608 times.
|
403040 | for( i = 0; i < 4; i++ ) { |
521 |
2/2✓ Branch 0 taken 130271 times.
✓ Branch 1 taken 192161 times.
|
322432 | bS[i] = 1 + !!(sl->non_zero_count_cache[scan8[0]+i] | mbn_nnz[i]); |
522 | } | ||
523 | } | ||
524 | } | ||
525 | // Do not use s->qscale as luma quantizer because it has not the same | ||
526 | // value in IPCM macroblocks. | ||
527 | 183250 | qp = (h->cur_pic.qscale_table[mb_xy] + h->cur_pic.qscale_table[mbn_xy] + 1) >> 1; | |
528 | ff_tlog(h->avctx, "filter mb:%d/%d dir:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, qp, tmp_linesize, tmp_uvlinesize); | ||
529 |
2/2✓ Branch 0 taken 733000 times.
✓ Branch 1 taken 183250 times.
|
916250 | { int i; for (i = 0; i < 4; i++) ff_tlog(h->avctx, " bS[%d]:%d", i, bS[i]); ff_tlog(h->avctx, "\n"); } |
530 | 183250 | filter_mb_edgeh( &img_y[j*linesize], tmp_linesize, bS, qp, a, b, h, 0 ); | |
531 | 183250 | chroma_qp_avg[0] = (sl->chroma_qp[0] + get_chroma_qp(h->ps.pps, 0, h->cur_pic.qscale_table[mbn_xy]) + 1) >> 1; | |
532 | 183250 | chroma_qp_avg[1] = (sl->chroma_qp[1] + get_chroma_qp(h->ps.pps, 1, h->cur_pic.qscale_table[mbn_xy]) + 1) >> 1; | |
533 |
1/2✓ Branch 0 taken 183250 times.
✗ Branch 1 not taken.
|
183250 | if (chroma) { |
534 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 183250 times.
|
183250 | if (chroma444) { |
535 | ✗ | filter_mb_edgeh (&img_cb[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[0], a, b, h, 0); | |
536 | ✗ | filter_mb_edgeh (&img_cr[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[1], a, b, h, 0); | |
537 | } else { | ||
538 | 183250 | filter_mb_edgech(&img_cb[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[0], a, b, h, 0); | |
539 | 183250 | filter_mb_edgech(&img_cr[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[1], a, b, h, 0); | |
540 | } | ||
541 | } | ||
542 | } | ||
543 | }else{ | ||
544 | 19309624 | LOCAL_ALIGNED(8, int16_t, bS, [4]); | |
545 | int qp; | ||
546 | |||
547 |
2/2✓ Branch 0 taken 6047428 times.
✓ Branch 1 taken 13262196 times.
|
19309624 | if( IS_INTRA(mb_type|mbm_type)) { |
548 | 6047428 | AV_WN64A(bS, 0x0003000300030003ULL); | |
549 |
2/2✓ Branch 0 taken 1383664 times.
✓ Branch 1 taken 4663764 times.
|
6047428 | if ( (!IS_INTERLACED(mb_type|mbm_type)) |
550 |
5/6✓ Branch 0 taken 1053051 times.
✓ Branch 1 taken 330613 times.
✓ Branch 2 taken 1053051 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 648459 times.
✓ Branch 5 taken 735205 times.
|
1383664 | || ((FRAME_MBAFF(h) || (h->picture_structure != PICT_FRAME)) && (dir == 0)) |
551 | ) | ||
552 | 5312223 | AV_WN64A(bS, 0x0004000400040004ULL); | |
553 | } else { | ||
554 | int i; | ||
555 | int mv_done; | ||
556 | |||
557 |
6/6✓ Branch 0 taken 6593722 times.
✓ Branch 1 taken 6668474 times.
✓ Branch 2 taken 609223 times.
✓ Branch 3 taken 5984499 times.
✓ Branch 4 taken 83832 times.
✓ Branch 5 taken 525391 times.
|
13262196 | if( dir && FRAME_MBAFF(h) && IS_INTERLACED(mb_type ^ mbm_type)) { |
558 | 83832 | AV_WN64A(bS, 0x0001000100010001ULL); | |
559 | 83832 | mv_done = 1; | |
560 | } | ||
561 |
4/4✓ Branch 0 taken 10475756 times.
✓ Branch 1 taken 2702608 times.
✓ Branch 2 taken 9619369 times.
✓ Branch 3 taken 856387 times.
|
13178364 | else if( mask_par0 && ((mbm_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) { |
562 | 9619369 | int b_idx= 8 + 4; | |
563 |
2/2✓ Branch 0 taken 4783104 times.
✓ Branch 1 taken 4836265 times.
|
9619369 | int bn_idx= b_idx - (dir ? 8:1); |
564 | |||
565 | 9619369 | bS[0] = bS[1] = bS[2] = bS[3] = check_mv(sl, 8 + 4, bn_idx, mvy_limit); | |
566 | 9619369 | mv_done = 1; | |
567 | } | ||
568 | else | ||
569 | 3558995 | mv_done = 0; | |
570 | |||
571 |
2/2✓ Branch 0 taken 53048784 times.
✓ Branch 1 taken 13262196 times.
|
66310980 | for( i = 0; i < 4; i++ ) { |
572 |
2/2✓ Branch 0 taken 26374888 times.
✓ Branch 1 taken 26673896 times.
|
53048784 | int x = dir == 0 ? 0 : i; |
573 |
2/2✓ Branch 0 taken 26673896 times.
✓ Branch 1 taken 26374888 times.
|
53048784 | int y = dir == 0 ? i : 0; |
574 | 53048784 | int b_idx= 8 + 4 + x + 8*y; | |
575 |
2/2✓ Branch 0 taken 26374888 times.
✓ Branch 1 taken 26673896 times.
|
53048784 | int bn_idx= b_idx - (dir ? 8:1); |
576 | |||
577 | 53048784 | if (sl->non_zero_count_cache[b_idx] | | |
578 |
2/2✓ Branch 0 taken 14850088 times.
✓ Branch 1 taken 38198696 times.
|
53048784 | sl->non_zero_count_cache[bn_idx]) { |
579 | 14850088 | bS[i] = 2; | |
580 | } | ||
581 |
2/2✓ Branch 0 taken 6944253 times.
✓ Branch 1 taken 31254443 times.
|
38198696 | else if(!mv_done) |
582 | { | ||
583 | 6944253 | bS[i] = check_mv(sl, b_idx, bn_idx, mvy_limit); | |
584 | } | ||
585 | } | ||
586 | } | ||
587 | |||
588 | /* Filter edge */ | ||
589 | // Do not use s->qscale as luma quantizer because it has not the same | ||
590 | // value in IPCM macroblocks. | ||
591 |
2/2✓ Branch 0 taken 13717630 times.
✓ Branch 1 taken 5591994 times.
|
19309624 | if(bS[0]+bS[1]+bS[2]+bS[3]){ |
592 | 13717630 | qp = (h->cur_pic.qscale_table[mb_xy] + h->cur_pic.qscale_table[mbm_xy] + 1) >> 1; | |
593 | //ff_tlog(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], h->cur_pic.qscale_table[mbn_xy]); | ||
594 | ff_tlog(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); | ||
595 | //{ int i; for (i = 0; i < 4; i++) ff_tlog(h->avctx, " bS[%d]:%d", i, bS[i]); ff_tlog(h->avctx, "\n"); } | ||
596 | 13717630 | chroma_qp_avg[0] = (sl->chroma_qp[0] + get_chroma_qp(h->ps.pps, 0, h->cur_pic.qscale_table[mbm_xy]) + 1) >> 1; | |
597 | 13717630 | chroma_qp_avg[1] = (sl->chroma_qp[1] + get_chroma_qp(h->ps.pps, 1, h->cur_pic.qscale_table[mbm_xy]) + 1) >> 1; | |
598 |
2/2✓ Branch 0 taken 6822276 times.
✓ Branch 1 taken 6895354 times.
|
13717630 | if( dir == 0 ) { |
599 | 6822276 | filter_mb_edgev( &img_y[0], linesize, bS, qp, a, b, h, 1 ); | |
600 |
2/2✓ Branch 0 taken 6759248 times.
✓ Branch 1 taken 63028 times.
|
6822276 | if (chroma) { |
601 |
2/2✓ Branch 0 taken 31200 times.
✓ Branch 1 taken 6728048 times.
|
6759248 | if (chroma444) { |
602 | 31200 | filter_mb_edgev ( &img_cb[0], uvlinesize, bS, chroma_qp_avg[0], a, b, h, 1); | |
603 | 31200 | filter_mb_edgev ( &img_cr[0], uvlinesize, bS, chroma_qp_avg[1], a, b, h, 1); | |
604 | } else { | ||
605 | 6728048 | filter_mb_edgecv( &img_cb[0], uvlinesize, bS, chroma_qp_avg[0], a, b, h, 1); | |
606 | 6728048 | filter_mb_edgecv( &img_cr[0], uvlinesize, bS, chroma_qp_avg[1], a, b, h, 1); | |
607 | } | ||
608 | } | ||
609 | } else { | ||
610 | 6895354 | filter_mb_edgeh( &img_y[0], linesize, bS, qp, a, b, h, 1 ); | |
611 |
2/2✓ Branch 0 taken 6831579 times.
✓ Branch 1 taken 63775 times.
|
6895354 | if (chroma) { |
612 |
2/2✓ Branch 0 taken 31199 times.
✓ Branch 1 taken 6800380 times.
|
6831579 | if (chroma444) { |
613 | 31199 | filter_mb_edgeh ( &img_cb[0], uvlinesize, bS, chroma_qp_avg[0], a, b, h, 1); | |
614 | 31199 | filter_mb_edgeh ( &img_cr[0], uvlinesize, bS, chroma_qp_avg[1], a, b, h, 1); | |
615 | } else { | ||
616 | 6800380 | filter_mb_edgech( &img_cb[0], uvlinesize, bS, chroma_qp_avg[0], a, b, h, 1); | |
617 | 6800380 | filter_mb_edgech( &img_cr[0], uvlinesize, bS, chroma_qp_avg[1], a, b, h, 1); | |
618 | } | ||
619 | } | ||
620 | } | ||
621 | } | ||
622 | } | ||
623 | } | ||
624 | |||
625 | /* Calculate bS */ | ||
626 |
2/2✓ Branch 0 taken 40962414 times.
✓ Branch 1 taken 20562580 times.
|
61524994 | for( edge = 1; edge < edges; edge++ ) { |
627 | 40962414 | LOCAL_ALIGNED(8, int16_t, bS, [4]); | |
628 | int qp; | ||
629 | 40962414 | const int deblock_edge = !IS_8x8DCT(mb_type & (edge<<24)); // (edge&1) && IS_8x8DCT(mb_type) | |
630 | |||
631 |
6/6✓ Branch 0 taken 7398124 times.
✓ Branch 1 taken 33564290 times.
✓ Branch 2 taken 1548276 times.
✓ Branch 3 taken 5849848 times.
✓ Branch 4 taken 774138 times.
✓ Branch 5 taken 774138 times.
|
40962414 | if (!deblock_edge && (!chroma422 || dir == 0)) |
632 | 11405249 | continue; | |
633 | |||
634 |
2/2✓ Branch 0 taken 13357988 times.
✓ Branch 1 taken 20980440 times.
|
34338428 | if( IS_INTRA(mb_type)) { |
635 | 13357988 | AV_WN64A(bS, 0x0003000300030003ULL); | |
636 | } else { | ||
637 | int i; | ||
638 | int mv_done; | ||
639 | |||
640 |
2/2✓ Branch 0 taken 13502391 times.
✓ Branch 1 taken 7478049 times.
|
20980440 | if( edge & mask_edge ) { |
641 | 13502391 | AV_ZERO64(bS); | |
642 | 13502391 | mv_done = 1; | |
643 | } | ||
644 |
2/2✓ Branch 0 taken 872201 times.
✓ Branch 1 taken 6605848 times.
|
7478049 | else if( mask_par0 ) { |
645 |
2/2✓ Branch 0 taken 456832 times.
✓ Branch 1 taken 415369 times.
|
872201 | int b_idx= 8 + 4 + edge * (dir ? 8:1); |
646 |
2/2✓ Branch 0 taken 456832 times.
✓ Branch 1 taken 415369 times.
|
872201 | int bn_idx= b_idx - (dir ? 8:1); |
647 | |||
648 | 872201 | bS[0] = bS[1] = bS[2] = bS[3] = check_mv(sl, b_idx, bn_idx, mvy_limit); | |
649 | 872201 | mv_done = 1; | |
650 | } | ||
651 | else | ||
652 | 6605848 | mv_done = 0; | |
653 | |||
654 |
2/2✓ Branch 0 taken 83921760 times.
✓ Branch 1 taken 20980440 times.
|
104902200 | for( i = 0; i < 4; i++ ) { |
655 |
2/2✓ Branch 0 taken 41938080 times.
✓ Branch 1 taken 41983680 times.
|
83921760 | int x = dir == 0 ? edge : i; |
656 |
2/2✓ Branch 0 taken 41938080 times.
✓ Branch 1 taken 41983680 times.
|
83921760 | int y = dir == 0 ? i : edge; |
657 | 83921760 | int b_idx= 8 + 4 + x + 8*y; | |
658 |
2/2✓ Branch 0 taken 41983680 times.
✓ Branch 1 taken 41938080 times.
|
83921760 | int bn_idx= b_idx - (dir ? 8:1); |
659 | |||
660 | 83921760 | if (sl->non_zero_count_cache[b_idx] | | |
661 |
2/2✓ Branch 0 taken 40595673 times.
✓ Branch 1 taken 43326087 times.
|
83921760 | sl->non_zero_count_cache[bn_idx]) { |
662 | 40595673 | bS[i] = 2; | |
663 | } | ||
664 |
2/2✓ Branch 0 taken 12499982 times.
✓ Branch 1 taken 30826105 times.
|
43326087 | else if(!mv_done) |
665 | { | ||
666 | 12499982 | bS[i] = check_mv(sl, b_idx, bn_idx, mvy_limit); | |
667 | } | ||
668 | } | ||
669 | |||
670 |
2/2✓ Branch 0 taken 4781263 times.
✓ Branch 1 taken 16199177 times.
|
20980440 | if(bS[0]+bS[1]+bS[2]+bS[3] == 0) |
671 | 4781263 | continue; | |
672 | } | ||
673 | |||
674 | /* Filter edge */ | ||
675 | // Do not use s->qscale as luma quantizer because it has not the same | ||
676 | // value in IPCM macroblocks. | ||
677 | 29557165 | qp = h->cur_pic.qscale_table[mb_xy]; | |
678 | //ff_tlog(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], h->cur_pic.qscale_table[mbn_xy]); | ||
679 | ff_tlog(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); | ||
680 | //{ int i; for (i = 0; i < 4; i++) ff_tlog(h->avctx, " bS[%d]:%d", i, bS[i]); ff_tlog(h->avctx, "\n"); } | ||
681 |
2/2✓ Branch 0 taken 14398023 times.
✓ Branch 1 taken 15159142 times.
|
29557165 | if( dir == 0 ) { |
682 | 14398023 | filter_mb_edgev( &img_y[4*edge << h->pixel_shift], linesize, bS, qp, a, b, h, 0 ); | |
683 |
2/2✓ Branch 0 taken 14267029 times.
✓ Branch 1 taken 130994 times.
|
14398023 | if (chroma) { |
684 |
2/2✓ Branch 0 taken 47636 times.
✓ Branch 1 taken 14219393 times.
|
14267029 | if (chroma444) { |
685 | 47636 | filter_mb_edgev ( &img_cb[4*edge << h->pixel_shift], uvlinesize, bS, sl->chroma_qp[0], a, b, h, 0); | |
686 | 47636 | filter_mb_edgev ( &img_cr[4*edge << h->pixel_shift], uvlinesize, bS, sl->chroma_qp[1], a, b, h, 0); | |
687 |
2/2✓ Branch 0 taken 6188119 times.
✓ Branch 1 taken 8031274 times.
|
14219393 | } else if( (edge&1) == 0 ) { |
688 | 6188119 | filter_mb_edgecv( &img_cb[2*edge << h->pixel_shift], uvlinesize, bS, sl->chroma_qp[0], a, b, h, 0); | |
689 | 6188119 | filter_mb_edgecv( &img_cr[2*edge << h->pixel_shift], uvlinesize, bS, sl->chroma_qp[1], a, b, h, 0); | |
690 | } | ||
691 | } | ||
692 | } else { | ||
693 |
2/2✓ Branch 0 taken 2064167 times.
✓ Branch 1 taken 13094975 times.
|
15159142 | if (chroma422) { |
694 |
2/2✓ Branch 0 taken 1290264 times.
✓ Branch 1 taken 773903 times.
|
2064167 | if (deblock_edge) |
695 | 1290264 | filter_mb_edgeh(&img_y[4*edge*linesize], linesize, bS, qp, a, b, h, 0); | |
696 |
1/2✓ Branch 0 taken 2064167 times.
✗ Branch 1 not taken.
|
2064167 | if (chroma) { |
697 | 2064167 | filter_mb_edgech(&img_cb[4*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[0], a, b, h, 0); | |
698 | 2064167 | filter_mb_edgech(&img_cr[4*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[1], a, b, h, 0); | |
699 | } | ||
700 | } else { | ||
701 | 13094975 | filter_mb_edgeh(&img_y[4*edge*linesize], linesize, bS, qp, a, b, h, 0); | |
702 |
2/2✓ Branch 0 taken 12964260 times.
✓ Branch 1 taken 130715 times.
|
13094975 | if (chroma) { |
703 |
2/2✓ Branch 0 taken 47937 times.
✓ Branch 1 taken 12916323 times.
|
12964260 | if (chroma444) { |
704 | 47937 | filter_mb_edgeh (&img_cb[4*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[0], a, b, h, 0); | |
705 | 47937 | filter_mb_edgeh (&img_cr[4*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[1], a, b, h, 0); | |
706 |
2/2✓ Branch 0 taken 5483099 times.
✓ Branch 1 taken 7433224 times.
|
12916323 | } else if ((edge&1) == 0) { |
707 | 5483099 | filter_mb_edgech(&img_cb[2*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[0], a, b, h, 0); | |
708 | 5483099 | filter_mb_edgech(&img_cr[2*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[1], a, b, h, 0); | |
709 | } | ||
710 | } | ||
711 | } | ||
712 | } | ||
713 | } | ||
714 | 20562580 | } | |
715 | |||
716 | 10281290 | void ff_h264_filter_mb(const H264Context *h, H264SliceContext *sl, | |
717 | int mb_x, int mb_y, | ||
718 | uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, | ||
719 | unsigned int linesize, unsigned int uvlinesize) | ||
720 | { | ||
721 | 10281290 | const int mb_xy= mb_x + mb_y*h->mb_stride; | |
722 | 10281290 | const int mb_type = h->cur_pic.mb_type[mb_xy]; | |
723 |
2/2✓ Branch 0 taken 3541070 times.
✓ Branch 1 taken 6740220 times.
|
10281290 | const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4; |
724 | 10281290 | int first_vertical_edge_done = 0; | |
725 | 10281290 | int chroma = CHROMA(h) && !(CONFIG_GRAY && (h->flags & AV_CODEC_FLAG_GRAY)); | |
726 | 10281290 | int qp_bd_offset = 6 * (h->ps.sps->bit_depth_luma - 8); | |
727 | 10281290 | int a = 52 + sl->slice_alpha_c0_offset - qp_bd_offset; | |
728 | 10281290 | int b = 52 + sl->slice_beta_offset - qp_bd_offset; | |
729 | |||
730 |
2/2✓ Branch 0 taken 1608490 times.
✓ Branch 1 taken 8672800 times.
|
10281290 | if (FRAME_MBAFF(h) |
731 | // and current and left pair do not have the same interlaced type | ||
732 |
2/2✓ Branch 0 taken 352491 times.
✓ Branch 1 taken 1255999 times.
|
1608490 | && IS_INTERLACED(mb_type ^ sl->left_type[LTOP]) |
733 | // and left mb is in available to us | ||
734 |
2/2✓ Branch 0 taken 343038 times.
✓ Branch 1 taken 9453 times.
|
352491 | && sl->left_type[LTOP]) { |
735 | /* First vertical edge is different in MBAFF frames | ||
736 | * There are 8 different bS to compute and 2 different Qp | ||
737 | */ | ||
738 | 343038 | LOCAL_ALIGNED(8, int16_t, bS, [8]); | |
739 | int qp[2]; | ||
740 | int bqp[2]; | ||
741 | int rqp[2]; | ||
742 | int mb_qp, mbn0_qp, mbn1_qp; | ||
743 | int i; | ||
744 | 343038 | first_vertical_edge_done = 1; | |
745 | |||
746 |
2/2✓ Branch 0 taken 166747 times.
✓ Branch 1 taken 176291 times.
|
343038 | if( IS_INTRA(mb_type) ) { |
747 | 166747 | AV_WN64A(&bS[0], 0x0004000400040004ULL); | |
748 | 166747 | AV_WN64A(&bS[4], 0x0004000400040004ULL); | |
749 | } else { | ||
750 | static const uint8_t offset[2][2][8]={ | ||
751 | { | ||
752 | {3+4*0, 3+4*0, 3+4*0, 3+4*0, 3+4*1, 3+4*1, 3+4*1, 3+4*1}, | ||
753 | {3+4*2, 3+4*2, 3+4*2, 3+4*2, 3+4*3, 3+4*3, 3+4*3, 3+4*3}, | ||
754 | },{ | ||
755 | {3+4*0, 3+4*1, 3+4*2, 3+4*3, 3+4*0, 3+4*1, 3+4*2, 3+4*3}, | ||
756 | {3+4*0, 3+4*1, 3+4*2, 3+4*3, 3+4*0, 3+4*1, 3+4*2, 3+4*3}, | ||
757 | } | ||
758 | }; | ||
759 | 176291 | const uint8_t *off= offset[MB_FIELD(sl)][mb_y&1]; | |
760 |
2/2✓ Branch 0 taken 1410328 times.
✓ Branch 1 taken 176291 times.
|
1586619 | for( i = 0; i < 8; i++ ) { |
761 |
2/2✓ Branch 0 taken 734608 times.
✓ Branch 1 taken 675720 times.
|
1410328 | int j= MB_FIELD(sl) ? i>>2 : i&1; |
762 | 1410328 | int mbn_xy = sl->left_mb_xy[LEFT(j)]; | |
763 | 1410328 | int mbn_type = sl->left_type[LEFT(j)]; | |
764 | |||
765 |
2/2✓ Branch 0 taken 158044 times.
✓ Branch 1 taken 1252284 times.
|
1410328 | if( IS_INTRA( mbn_type ) ) |
766 | 158044 | bS[i] = 4; | |
767 | else{ | ||
768 |
2/2✓ Branch 0 taken 532281 times.
✓ Branch 1 taken 720003 times.
|
1252284 | bS[i] = 1 + !!(sl->non_zero_count_cache[12+8*(i>>1)] | |
769 |
2/2✓ Branch 0 taken 31036 times.
✓ Branch 1 taken 212464 times.
|
243500 | ((!h->ps.pps->cabac && IS_8x8DCT(mbn_type)) ? |
770 |
4/4✓ Branch 0 taken 16400 times.
✓ Branch 1 taken 14636 times.
✓ Branch 2 taken 15540 times.
✓ Branch 3 taken 15496 times.
|
31036 | (h->cbp_table[mbn_xy] & (((MB_FIELD(sl) ? (i&2) : (mb_y&1)) ? 8 : 2) << 12)) |
771 |
2/2✓ Branch 0 taken 243500 times.
✓ Branch 1 taken 1008784 times.
|
1283320 | : |
772 | 1221248 | h->non_zero_count[mbn_xy][ off[i] ])); | |
773 | } | ||
774 | } | ||
775 | } | ||
776 | |||
777 | 343038 | mb_qp = h->cur_pic.qscale_table[mb_xy]; | |
778 | 343038 | mbn0_qp = h->cur_pic.qscale_table[sl->left_mb_xy[0]]; | |
779 | 343038 | mbn1_qp = h->cur_pic.qscale_table[sl->left_mb_xy[1]]; | |
780 | 343038 | qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1; | |
781 | 343038 | bqp[0] = (get_chroma_qp(h->ps.pps, 0, mb_qp) + | |
782 | 343038 | get_chroma_qp(h->ps.pps, 0, mbn0_qp) + 1) >> 1; | |
783 | 343038 | rqp[0] = (get_chroma_qp(h->ps.pps, 1, mb_qp) + | |
784 | 343038 | get_chroma_qp(h->ps.pps, 1, mbn0_qp) + 1) >> 1; | |
785 | 343038 | qp[1] = ( mb_qp + mbn1_qp + 1 ) >> 1; | |
786 | 343038 | bqp[1] = (get_chroma_qp(h->ps.pps, 0, mb_qp) + | |
787 | 343038 | get_chroma_qp(h->ps.pps, 0, mbn1_qp) + 1 ) >> 1; | |
788 | 343038 | rqp[1] = (get_chroma_qp(h->ps.pps, 1, mb_qp) + | |
789 | 343038 | get_chroma_qp(h->ps.pps, 1, mbn1_qp) + 1 ) >> 1; | |
790 | |||
791 | /* Filter edge */ | ||
792 | ff_tlog(h->avctx, "filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d", mb_x, mb_y, qp[0], qp[1], bqp[0], bqp[1], rqp[0], rqp[1], linesize, uvlinesize); | ||
793 |
2/2✓ Branch 0 taken 2744304 times.
✓ Branch 1 taken 343038 times.
|
3087342 | { int i; for (i = 0; i < 8; i++) ff_tlog(h->avctx, " bS[%d]:%d", i, bS[i]); ff_tlog(h->avctx, "\n"); } |
794 |
2/2✓ Branch 0 taken 172381 times.
✓ Branch 1 taken 170657 times.
|
343038 | if (MB_FIELD(sl)) { |
795 | 172381 | filter_mb_mbaff_edgev ( h, img_y , linesize, bS , 1, qp [0], a, b, 1 ); | |
796 | 172381 | filter_mb_mbaff_edgev ( h, img_y + 8* linesize, linesize, bS+4, 1, qp [1], a, b, 1 ); | |
797 |
1/2✓ Branch 0 taken 172381 times.
✗ Branch 1 not taken.
|
172381 | if (chroma){ |
798 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 172381 times.
|
172381 | if (CHROMA444(h)) { |
799 | ✗ | filter_mb_mbaff_edgev ( h, img_cb, uvlinesize, bS , 1, bqp[0], a, b, 1 ); | |
800 | ✗ | filter_mb_mbaff_edgev ( h, img_cb + 8*uvlinesize, uvlinesize, bS+4, 1, bqp[1], a, b, 1 ); | |
801 | ✗ | filter_mb_mbaff_edgev ( h, img_cr, uvlinesize, bS , 1, rqp[0], a, b, 1 ); | |
802 | ✗ | filter_mb_mbaff_edgev ( h, img_cr + 8*uvlinesize, uvlinesize, bS+4, 1, rqp[1], a, b, 1 ); | |
803 |
2/2✓ Branch 0 taken 27784 times.
✓ Branch 1 taken 144597 times.
|
172381 | } else if (CHROMA422(h)) { |
804 | 27784 | filter_mb_mbaff_edgecv(h, img_cb, uvlinesize, bS , 1, bqp[0], a, b, 1); | |
805 | 27784 | filter_mb_mbaff_edgecv(h, img_cb + 8*uvlinesize, uvlinesize, bS+4, 1, bqp[1], a, b, 1); | |
806 | 27784 | filter_mb_mbaff_edgecv(h, img_cr, uvlinesize, bS , 1, rqp[0], a, b, 1); | |
807 | 27784 | filter_mb_mbaff_edgecv(h, img_cr + 8*uvlinesize, uvlinesize, bS+4, 1, rqp[1], a, b, 1); | |
808 | }else{ | ||
809 | 144597 | filter_mb_mbaff_edgecv( h, img_cb, uvlinesize, bS , 1, bqp[0], a, b, 1 ); | |
810 | 144597 | filter_mb_mbaff_edgecv( h, img_cb + 4*uvlinesize, uvlinesize, bS+4, 1, bqp[1], a, b, 1 ); | |
811 | 144597 | filter_mb_mbaff_edgecv( h, img_cr, uvlinesize, bS , 1, rqp[0], a, b, 1 ); | |
812 | 144597 | filter_mb_mbaff_edgecv( h, img_cr + 4*uvlinesize, uvlinesize, bS+4, 1, rqp[1], a, b, 1 ); | |
813 | } | ||
814 | } | ||
815 | }else{ | ||
816 | 170657 | filter_mb_mbaff_edgev ( h, img_y , 2* linesize, bS , 2, qp [0], a, b, 1 ); | |
817 | 170657 | filter_mb_mbaff_edgev ( h, img_y + linesize, 2* linesize, bS+1, 2, qp [1], a, b, 1 ); | |
818 |
1/2✓ Branch 0 taken 170657 times.
✗ Branch 1 not taken.
|
170657 | if (chroma){ |
819 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 170657 times.
|
170657 | if (CHROMA444(h)) { |
820 | ✗ | filter_mb_mbaff_edgev ( h, img_cb, 2*uvlinesize, bS , 2, bqp[0], a, b, 1 ); | |
821 | ✗ | filter_mb_mbaff_edgev ( h, img_cb + uvlinesize, 2*uvlinesize, bS+1, 2, bqp[1], a, b, 1 ); | |
822 | ✗ | filter_mb_mbaff_edgev ( h, img_cr, 2*uvlinesize, bS , 2, rqp[0], a, b, 1 ); | |
823 | ✗ | filter_mb_mbaff_edgev ( h, img_cr + uvlinesize, 2*uvlinesize, bS+1, 2, rqp[1], a, b, 1 ); | |
824 | }else{ | ||
825 | 170657 | filter_mb_mbaff_edgecv( h, img_cb, 2*uvlinesize, bS , 2, bqp[0], a, b, 1 ); | |
826 | 170657 | filter_mb_mbaff_edgecv( h, img_cb + uvlinesize, 2*uvlinesize, bS+1, 2, bqp[1], a, b, 1 ); | |
827 | 170657 | filter_mb_mbaff_edgecv( h, img_cr, 2*uvlinesize, bS , 2, rqp[0], a, b, 1 ); | |
828 | 170657 | filter_mb_mbaff_edgecv( h, img_cr + uvlinesize, 2*uvlinesize, bS+1, 2, rqp[1], a, b, 1 ); | |
829 | } | ||
830 | } | ||
831 | } | ||
832 | } | ||
833 | |||
834 | #if CONFIG_SMALL | ||
835 | { | ||
836 | int dir; | ||
837 | for (dir = 0; dir < 2; dir++) | ||
838 | filter_mb_dir(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, | ||
839 | uvlinesize, mb_xy, mb_type, mvy_limit, | ||
840 | dir ? 0 : first_vertical_edge_done, a, b, | ||
841 | chroma, dir); | ||
842 | } | ||
843 | #else | ||
844 | 10281290 | filter_mb_dir(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, mb_xy, mb_type, mvy_limit, first_vertical_edge_done, a, b, chroma, 0); | |
845 | 10281290 | filter_mb_dir(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, mb_xy, mb_type, mvy_limit, 0, a, b, chroma, 1); | |
846 | #endif | ||
847 | 10281290 | } | |
848 |