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 | 22365314 | 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 | 22365314 | const unsigned int index_a = qp + a; | |
106 | 22365314 | const int alpha = alpha_table[index_a]; | |
107 | 22365314 | const int beta = beta_table[qp + b]; | |
108 |
3/4✓ Branch 0 taken 22002204 times.
✓ Branch 1 taken 363110 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22002204 times.
|
22365314 | if (alpha ==0 || beta == 0) return; |
109 | |||
110 |
3/4✓ Branch 0 taken 3057484 times.
✓ Branch 1 taken 18944720 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3057484 times.
|
40946924 | if( bS[0] < 4 || !intra ) { |
111 | int8_t tc[4]; | ||
112 | 18944720 | tc[0] = tc0_table[index_a][bS[0]]; | |
113 | 18944720 | tc[1] = tc0_table[index_a][bS[1]]; | |
114 | 18944720 | tc[2] = tc0_table[index_a][bS[2]]; | |
115 | 18944720 | tc[3] = tc0_table[index_a][bS[3]]; | |
116 | 18944720 | h->h264dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc); | |
117 | } else { | ||
118 | 3057484 | h->h264dsp.h264_h_loop_filter_luma_intra(pix, stride, alpha, beta); | |
119 | } | ||
120 | } | ||
121 | |||
122 | 27190216 | 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 | 27190216 | const unsigned int index_a = qp + a; | |
128 | 27190216 | const int alpha = alpha_table[index_a]; | |
129 | 27190216 | const int beta = beta_table[qp + b]; | |
130 |
3/4✓ Branch 0 taken 26539306 times.
✓ Branch 1 taken 650910 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 26539306 times.
|
27190216 | if (alpha ==0 || beta == 0) return; |
131 | |||
132 |
3/4✓ Branch 0 taken 5894489 times.
✓ Branch 1 taken 20644817 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5894489 times.
|
47184123 | if( bS[0] < 4 || !intra ) { |
133 | int8_t tc[4]; | ||
134 | 20644817 | tc[0] = tc0_table[index_a][bS[0]]+1; | |
135 | 20644817 | tc[1] = tc0_table[index_a][bS[1]]+1; | |
136 | 20644817 | tc[2] = tc0_table[index_a][bS[2]]+1; | |
137 | 20644817 | tc[3] = tc0_table[index_a][bS[3]]+1; | |
138 | 20644817 | h->h264dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc); | |
139 | } else { | ||
140 | 5894489 | h->h264dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta); | |
141 | } | ||
142 | } | ||
143 | |||
144 | 726404 | static av_always_inline void filter_mb_mbaff_edgev(const H264Context *h, uint8_t *pix, | |
145 | int stride, | ||
146 | const int16_t bS[ /* 1 + 2 * bsi */ ], int bsi, | ||
147 | int qp, int a, int b, | ||
148 | int intra) | ||
149 | { | ||
150 | 726404 | const unsigned int index_a = qp + a; | |
151 | 726404 | const int alpha = alpha_table[index_a]; | |
152 | 726404 | const int beta = beta_table[qp + b]; | |
153 |
3/4✓ Branch 0 taken 700962 times.
✓ Branch 1 taken 25442 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 700962 times.
|
726404 | if (alpha ==0 || beta == 0) return; |
154 | |||
155 |
3/4✓ Branch 0 taken 375635 times.
✓ Branch 1 taken 325327 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 375635 times.
|
1026289 | if( bS[0] < 4 || !intra ) { |
156 | int8_t tc[4]; | ||
157 | 325327 | tc[0] = tc0_table[index_a][bS[0*bsi]]; | |
158 | 325327 | tc[1] = tc0_table[index_a][bS[1*bsi]]; | |
159 | 325327 | tc[2] = tc0_table[index_a][bS[2*bsi]]; | |
160 | 325327 | tc[3] = tc0_table[index_a][bS[3*bsi]]; | |
161 | 325327 | h->h264dsp.h264_h_loop_filter_luma_mbaff(pix, stride, alpha, beta, tc); | |
162 | } else { | ||
163 | 375635 | h->h264dsp.h264_h_loop_filter_luma_mbaff_intra(pix, stride, alpha, beta); | |
164 | } | ||
165 | } | ||
166 | |||
167 | 1452808 | static av_always_inline void filter_mb_mbaff_edgecv(const H264Context *h, | |
168 | uint8_t *pix, int stride, | ||
169 | const int16_t bS[ /* 1 + 2 * bsi */ ], | ||
170 | int bsi, int qp, int a, | ||
171 | int b, int intra) | ||
172 | { | ||
173 | 1452808 | const unsigned int index_a = qp + a; | |
174 | 1452808 | const int alpha = alpha_table[index_a]; | |
175 | 1452808 | const int beta = beta_table[qp + b]; | |
176 |
3/4✓ Branch 0 taken 1401332 times.
✓ Branch 1 taken 51476 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1401332 times.
|
1452808 | if (alpha ==0 || beta == 0) return; |
177 | |||
178 |
3/4✓ Branch 0 taken 751136 times.
✓ Branch 1 taken 650196 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 751136 times.
|
2051528 | if( bS[0] < 4 || !intra ) { |
179 | int8_t tc[4]; | ||
180 | 650196 | tc[0] = tc0_table[index_a][bS[0*bsi]] + 1; | |
181 | 650196 | tc[1] = tc0_table[index_a][bS[1*bsi]] + 1; | |
182 | 650196 | tc[2] = tc0_table[index_a][bS[2*bsi]] + 1; | |
183 | 650196 | tc[3] = tc0_table[index_a][bS[3*bsi]] + 1; | |
184 | 650196 | h->h264dsp.h264_h_loop_filter_chroma_mbaff(pix, stride, alpha, beta, tc); | |
185 | } else { | ||
186 | 751136 | h->h264dsp.h264_h_loop_filter_chroma_mbaff_intra(pix, stride, alpha, beta); | |
187 | } | ||
188 | } | ||
189 | |||
190 | 22642753 | 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 | 22642753 | const unsigned int index_a = qp + a; | |
196 | 22642753 | const int alpha = alpha_table[index_a]; | |
197 | 22642753 | const int beta = beta_table[qp + b]; | |
198 |
3/4✓ Branch 0 taken 22274246 times.
✓ Branch 1 taken 368507 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22274246 times.
|
22642753 | if (alpha ==0 || beta == 0) return; |
199 | |||
200 |
3/4✓ Branch 0 taken 2428499 times.
✓ Branch 1 taken 19845747 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2428499 times.
|
42119993 | if( bS[0] < 4 || !intra ) { |
201 | int8_t tc[4]; | ||
202 | 19845747 | tc[0] = tc0_table[index_a][bS[0]]; | |
203 | 19845747 | tc[1] = tc0_table[index_a][bS[1]]; | |
204 | 19845747 | tc[2] = tc0_table[index_a][bS[2]]; | |
205 | 19845747 | tc[3] = tc0_table[index_a][bS[3]]; | |
206 | 19845747 | h->h264dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc); | |
207 | } else { | ||
208 | 2428499 | h->h264dsp.h264_v_loop_filter_luma_intra(pix, stride, alpha, beta); | |
209 | } | ||
210 | } | ||
211 | |||
212 | 30491570 | 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 | 30491570 | const unsigned int index_a = qp + a; | |
218 | 30491570 | const int alpha = alpha_table[index_a]; | |
219 | 30491570 | const int beta = beta_table[qp + b]; | |
220 |
3/4✓ Branch 0 taken 29838340 times.
✓ Branch 1 taken 653230 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 29838340 times.
|
30491570 | if (alpha ==0 || beta == 0) return; |
221 | |||
222 |
3/4✓ Branch 0 taken 4634428 times.
✓ Branch 1 taken 25203912 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4634428 times.
|
55042252 | if( bS[0] < 4 || !intra ) { |
223 | int8_t tc[4]; | ||
224 | 25203912 | tc[0] = tc0_table[index_a][bS[0]]+1; | |
225 | 25203912 | tc[1] = tc0_table[index_a][bS[1]]+1; | |
226 | 25203912 | tc[2] = tc0_table[index_a][bS[2]]+1; | |
227 | 25203912 | tc[3] = tc0_table[index_a][bS[3]]+1; | |
228 | 25203912 | h->h264dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc); | |
229 | } else { | ||
230 | 4634428 | h->h264dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta); | |
231 | } | ||
232 | } | ||
233 | |||
234 | 288098 | 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 | 288098 | int chroma = CHROMA(h) && !(CONFIG_GRAY && (h->flags & AV_CODEC_FLAG_GRAY)); | |
245 | 288098 | int chroma444 = CHROMA444(h); | |
246 | 288098 | int chroma422 = CHROMA422(h); | |
247 | |||
248 | 288098 | int mb_xy = sl->mb_xy; | |
249 | 288098 | int left_type = sl->left_type[LTOP]; | |
250 | 288098 | int top_type = sl->top_type; | |
251 | |||
252 | 288098 | int qp_bd_offset = 6 * (h->ps.sps->bit_depth_luma - 8); | |
253 | 288098 | int a = 52 + sl->slice_alpha_c0_offset - qp_bd_offset; | |
254 | 288098 | int b = 52 + sl->slice_beta_offset - qp_bd_offset; | |
255 | |||
256 | 288098 | int mb_type = h->cur_pic.mb_type[mb_xy]; | |
257 | 288098 | int qp = h->cur_pic.qscale_table[mb_xy]; | |
258 | 288098 | int qp0 = h->cur_pic.qscale_table[mb_xy - 1]; | |
259 | 288098 | int qp1 = h->cur_pic.qscale_table[sl->top_mb_xy]; | |
260 | 288098 | int qpc = get_chroma_qp(h->ps.pps, 0, qp); | |
261 | 288098 | int qpc0 = get_chroma_qp(h->ps.pps, 0, qp0); | |
262 | 288098 | int qpc1 = get_chroma_qp(h->ps.pps, 0, qp1); | |
263 | 288098 | qp0 = (qp + qp0 + 1) >> 1; | |
264 | 288098 | qp1 = (qp + qp1 + 1) >> 1; | |
265 | 288098 | qpc0 = (qpc + qpc0 + 1) >> 1; | |
266 | 288098 | qpc1 = (qpc + qpc1 + 1) >> 1; | |
267 | |||
268 |
2/2✓ Branch 0 taken 42510 times.
✓ Branch 1 taken 245588 times.
|
288098 | 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 21496 times.
✓ Branch 1 taken 21014 times.
|
42510 | const int16_t *bSH = FIELD_PICTURE(h) ? bS3 : bS4; |
272 |
2/2✓ Branch 0 taken 41848 times.
✓ Branch 1 taken 662 times.
|
42510 | if(left_type) |
273 | 41848 | filter_mb_edgev( &img_y[4*0<<pixel_shift], linesize, bS4, qp0, a, b, h, 1); | |
274 |
2/2✓ Branch 0 taken 10792 times.
✓ Branch 1 taken 31718 times.
|
42510 | if( IS_8x8DCT(mb_type) ) { |
275 | 10792 | filter_mb_edgev( &img_y[4*2<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
276 |
2/2✓ Branch 0 taken 10714 times.
✓ Branch 1 taken 78 times.
|
10792 | if(top_type){ |
277 | 10714 | filter_mb_edgeh( &img_y[4*0*linesize], linesize, bSH, qp1, a, b, h, 1); | |
278 | } | ||
279 | 10792 | filter_mb_edgeh( &img_y[4*2*linesize], linesize, bS3, qp, a, b, h, 0); | |
280 | } else { | ||
281 | 31718 | filter_mb_edgev( &img_y[4*1<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
282 | 31718 | filter_mb_edgev( &img_y[4*2<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
283 | 31718 | filter_mb_edgev( &img_y[4*3<<pixel_shift], linesize, bS3, qp, a, b, h, 0); | |
284 |
2/2✓ Branch 0 taken 30817 times.
✓ Branch 1 taken 901 times.
|
31718 | if(top_type){ |
285 | 30817 | filter_mb_edgeh( &img_y[4*0*linesize], linesize, bSH, qp1, a, b, h, 1); | |
286 | } | ||
287 | 31718 | filter_mb_edgeh( &img_y[4*1*linesize], linesize, bS3, qp, a, b, h, 0); | |
288 | 31718 | filter_mb_edgeh( &img_y[4*2*linesize], linesize, bS3, qp, a, b, h, 0); | |
289 | 31718 | filter_mb_edgeh( &img_y[4*3*linesize], linesize, bS3, qp, a, b, h, 0); | |
290 | } | ||
291 |
1/2✓ Branch 0 taken 42510 times.
✗ Branch 1 not taken.
|
42510 | if(chroma){ |
292 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 42510 times.
|
42510 | 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 42510 times.
|
42510 | }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 41848 times.
✓ Branch 1 taken 662 times.
|
42510 | if(left_type){ |
343 | 41848 | filter_mb_edgecv( &img_cb[2*0<<pixel_shift], uvlinesize, bS4, qpc0, a, b, h, 1); | |
344 | 41848 | filter_mb_edgecv( &img_cr[2*0<<pixel_shift], uvlinesize, bS4, qpc0, a, b, h, 1); | |
345 | } | ||
346 | 42510 | filter_mb_edgecv( &img_cb[2*2<<pixel_shift], uvlinesize, bS3, qpc, a, b, h, 0); | |
347 | 42510 | filter_mb_edgecv( &img_cr[2*2<<pixel_shift], uvlinesize, bS3, qpc, a, b, h, 0); | |
348 |
2/2✓ Branch 0 taken 41531 times.
✓ Branch 1 taken 979 times.
|
42510 | if(top_type){ |
349 | 41531 | filter_mb_edgech( &img_cb[2*0*uvlinesize], uvlinesize, bSH, qpc1, a, b, h, 1); | |
350 | 41531 | filter_mb_edgech( &img_cr[2*0*uvlinesize], uvlinesize, bSH, qpc1, a, b, h, 1); | |
351 | } | ||
352 | 42510 | filter_mb_edgech( &img_cb[2*2*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
353 | 42510 | filter_mb_edgech( &img_cr[2*2*uvlinesize], uvlinesize, bS3, qpc, a, b, h, 0); | |
354 | } | ||
355 | } | ||
356 | 42510 | return; | |
357 | } else { | ||
358 | 245588 | LOCAL_ALIGNED(8, int16_t, bS, [2], [4][4]); | |
359 | int edges; | ||
360 |
5/6✓ Branch 0 taken 37380 times.
✓ Branch 1 taken 208208 times.
✓ Branch 2 taken 12257 times.
✓ Branch 3 taken 25123 times.
✓ Branch 4 taken 12257 times.
✗ Branch 5 not taken.
|
245588 | if( IS_8x8DCT(mb_type) && (sl->cbp&7) == 7 && !chroma444 ) { |
361 | 12257 | edges = 4; | |
362 | 12257 | AV_WN64A(bS[0][0], 0x0002000200020002ULL); | |
363 | 12257 | AV_WN64A(bS[0][2], 0x0002000200020002ULL); | |
364 | 12257 | AV_WN64A(bS[1][0], 0x0002000200020002ULL); | |
365 | 12257 | AV_WN64A(bS[1][2], 0x0002000200020002ULL); | |
366 | } else { | ||
367 | 233331 | 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 | 233331 | 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 | 233331 | int step = 1+(mb_type>>24); //IS_8x8DCT(mb_type) ? 2 : 1; | |
370 | 233331 | edges = 4 - 3*((mb_type>>3) & !(sl->cbp & 15)); //(mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4; | |
371 | 233331 | h->h264dsp.h264_loop_filter_strength(bS, sl->non_zero_count_cache, sl->ref_cache, sl->mv_cache, | |
372 | 233331 | sl->list_count==2, edges, step, mask_edge0, mask_edge1, FIELD_PICTURE(h)); | |
373 | } | ||
374 |
2/2✓ Branch 0 taken 6921 times.
✓ Branch 1 taken 238667 times.
|
245588 | if( IS_INTRA(left_type) ) |
375 | 6921 | AV_WN64A(bS[0][0], 0x0004000400040004ULL); | |
376 |
2/2✓ Branch 0 taken 9898 times.
✓ Branch 1 taken 235690 times.
|
245588 | if( IS_INTRA(top_type) ) |
377 |
2/2✓ Branch 0 taken 7647 times.
✓ Branch 1 taken 2251 times.
|
9898 | 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 242032 times.
✓ Branch 1 taken 3556 times.
|
245588 | if(left_type) |
393 |
4/6✓ Branch 0 taken 85069 times.
✓ Branch 1 taken 156963 times.
✓ Branch 3 taken 85069 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 85069 times.
|
242032 | FILTER(v,0,0,1); |
394 |
2/2✓ Branch 0 taken 180478 times.
✓ Branch 1 taken 65110 times.
|
245588 | if( edges == 1 ) { |
395 |
2/2✓ Branch 0 taken 177806 times.
✓ Branch 1 taken 2672 times.
|
180478 | if(top_type) |
396 |
4/6✓ Branch 0 taken 32639 times.
✓ Branch 1 taken 145167 times.
✓ Branch 3 taken 32639 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 32639 times.
|
177806 | FILTER(h,1,0,1); |
397 |
2/2✓ Branch 0 taken 37380 times.
✓ Branch 1 taken 27730 times.
|
65110 | } else if( IS_8x8DCT(mb_type) ) { |
398 |
3/6✓ Branch 0 taken 37380 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 37380 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 37380 times.
|
37380 | FILTER(v,0,2,0); |
399 |
2/2✓ Branch 0 taken 37214 times.
✓ Branch 1 taken 166 times.
|
37380 | if(top_type) |
400 |
4/6✓ Branch 0 taken 35358 times.
✓ Branch 1 taken 1856 times.
✓ Branch 3 taken 35358 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 35358 times.
|
37214 | FILTER(h,1,0,1); |
401 |
3/6✓ Branch 0 taken 37380 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 37380 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 37380 times.
|
37380 | FILTER(h,1,2,0); |
402 | } else { | ||
403 |
4/6✓ Branch 0 taken 17652 times.
✓ Branch 1 taken 10078 times.
✓ Branch 3 taken 17652 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 17652 times.
|
27730 | FILTER(v,0,1,0); |
404 |
4/6✓ Branch 0 taken 21505 times.
✓ Branch 1 taken 6225 times.
✓ Branch 3 taken 21505 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 21505 times.
|
27730 | FILTER(v,0,2,0); |
405 |
4/6✓ Branch 0 taken 17574 times.
✓ Branch 1 taken 10156 times.
✓ Branch 3 taken 17574 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 17574 times.
|
27730 | FILTER(v,0,3,0); |
406 |
2/2✓ Branch 0 taken 27155 times.
✓ Branch 1 taken 575 times.
|
27730 | if(top_type) |
407 |
4/6✓ Branch 0 taken 23417 times.
✓ Branch 1 taken 3738 times.
✓ Branch 3 taken 23417 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 23417 times.
|
27155 | FILTER(h,1,0,1); |
408 |
4/6✓ Branch 0 taken 16725 times.
✓ Branch 1 taken 11005 times.
✓ Branch 3 taken 16725 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 16725 times.
|
27730 | FILTER(h,1,1,0); |
409 |
4/6✓ Branch 0 taken 21784 times.
✓ Branch 1 taken 5946 times.
✓ Branch 3 taken 21784 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 21784 times.
|
27730 | FILTER(h,1,2,0); |
410 |
4/6✓ Branch 0 taken 17146 times.
✓ Branch 1 taken 10584 times.
✓ Branch 3 taken 17146 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 17146 times.
|
27730 | FILTER(h,1,3,0); |
411 | } | ||
412 | #undef FILTER | ||
413 | } | ||
414 | } | ||
415 | |||
416 | 9359866 | 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 288494 times.
✓ Branch 1 taken 9071372 times.
✓ Branch 2 taken 396 times.
✓ Branch 3 taken 288098 times.
|
9359866 | if(!h->h264dsp.h264_loop_filter_strength || h->ps.pps->chroma_qp_diff) { |
423 | 9071768 | ff_h264_filter_mb(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize); | |
424 | 9071768 | 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 |
2/2✓ Branch 0 taken 39479 times.
✓ Branch 1 taken 248619 times.
|
288098 | if(h->pixel_shift){ |
431 | 39479 | h264_filter_mb_fast_internal(h, sl, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, 1); | |
432 | }else{ | ||
433 | 248619 | 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 | 31376329 | static int check_mv(H264SliceContext *sl, long b_idx, long bn_idx, int mvy_limit) | |
439 | { | ||
440 | int v; | ||
441 | |||
442 | 31376329 | v = sl->ref_cache[0][b_idx] != sl->ref_cache[0][bn_idx]; | |
443 |
4/4✓ Branch 0 taken 26727473 times.
✓ Branch 1 taken 4648856 times.
✓ Branch 2 taken 25268848 times.
✓ Branch 3 taken 1458625 times.
|
31376329 | if (!v && sl->ref_cache[0][b_idx] != -1) |
444 | 25268848 | v = sl->mv_cache[0][b_idx][0] - sl->mv_cache[0][bn_idx][0] + 3 >= 7U | | |
445 | 25268848 | FFABS(sl->mv_cache[0][b_idx][1] - sl->mv_cache[0][bn_idx][1]) >= mvy_limit; | |
446 | |||
447 |
2/2✓ Branch 0 taken 15806105 times.
✓ Branch 1 taken 15570224 times.
|
31376329 | if (sl->list_count == 2) { |
448 |
2/2✓ Branch 0 taken 12335738 times.
✓ Branch 1 taken 3470367 times.
|
15806105 | if(!v) |
449 | 12335738 | v = sl->ref_cache[1][b_idx] != sl->ref_cache[1][bn_idx] | | |
450 | 12335738 | sl->mv_cache[1][b_idx][0] - sl->mv_cache[1][bn_idx][0] + 3 >= 7U | | |
451 | 12335738 | FFABS(sl->mv_cache[1][b_idx][1] - sl->mv_cache[1][bn_idx][1]) >= mvy_limit; | |
452 | |||
453 |
2/2✓ Branch 0 taken 4972958 times.
✓ Branch 1 taken 10833147 times.
|
15806105 | if(v){ |
454 | 4972958 | if (sl->ref_cache[0][b_idx] != sl->ref_cache[1][bn_idx] | | |
455 |
2/2✓ Branch 0 taken 4612974 times.
✓ Branch 1 taken 359984 times.
|
4972958 | sl->ref_cache[1][b_idx] != sl->ref_cache[0][bn_idx]) |
456 | 4612974 | return 1; | |
457 | return | ||
458 | 359984 | sl->mv_cache[0][b_idx][0] - sl->mv_cache[1][bn_idx][0] + 3 >= 7U | | |
459 | 359984 | FFABS(sl->mv_cache[0][b_idx][1] - sl->mv_cache[1][bn_idx][1]) >= mvy_limit | | |
460 | 359984 | sl->mv_cache[1][b_idx][0] - sl->mv_cache[0][bn_idx][0] + 3 >= 7U | | |
461 | 359984 | FFABS(sl->mv_cache[1][b_idx][1] - sl->mv_cache[0][bn_idx][1]) >= mvy_limit; | |
462 | } | ||
463 | } | ||
464 | |||
465 | 26403371 | return v; | |
466 | } | ||
467 | |||
468 | 21604154 | 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 | 21604154 | int chroma444 = CHROMA444(h); | |
479 | 21604154 | int chroma422 = CHROMA422(h); | |
480 |
2/2✓ Branch 0 taken 10802077 times.
✓ Branch 1 taken 10802077 times.
|
21604154 | const int mbm_xy = dir == 0 ? mb_xy -1 : sl->top_mb_xy; |
481 |
2/2✓ Branch 0 taken 10802077 times.
✓ Branch 1 taken 10802077 times.
|
21604154 | 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 | 21604154 | const int mask_edge = mask_edge_tab[dir][(mb_type>>3)&7]; | |
487 |
4/4✓ Branch 0 taken 12464398 times.
✓ Branch 1 taken 9139756 times.
✓ Branch 2 taken 7517497 times.
✓ Branch 3 taken 4946901 times.
|
21604154 | 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 | 21604154 | const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)); | |
491 | |||
492 |
4/4✓ Branch 0 taken 20763798 times.
✓ Branch 1 taken 840356 times.
✓ Branch 2 taken 20400596 times.
✓ Branch 3 taken 363202 times.
|
21604154 | if(mbm_type && !first_vertical_edge_done){ |
493 | |||
494 |
6/6✓ Branch 0 taken 2958924 times.
✓ Branch 1 taken 17441672 times.
✓ Branch 2 taken 1629444 times.
✓ Branch 3 taken 1329480 times.
✓ Branch 4 taken 779311 times.
✓ Branch 5 taken 850133 times.
|
20400596 | if (FRAME_MBAFF(h) && (dir == 1) && ((mb_y&1) == 0) |
495 |
2/2✓ Branch 0 taken 98649 times.
✓ Branch 1 taken 680662 times.
|
779311 | && IS_INTERLACED(mbm_type&~mb_type) |
496 | 98649 | ) { | |
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 | 98649 | unsigned int tmp_linesize = 2 * linesize; | |
502 | 98649 | unsigned int tmp_uvlinesize = 2 * uvlinesize; | |
503 | 98649 | int mbn_xy = mb_xy - 2 * h->mb_stride; | |
504 | int j; | ||
505 | |||
506 |
2/2✓ Branch 0 taken 197298 times.
✓ Branch 1 taken 98649 times.
|
295947 | for(j=0; j<2; j++, mbn_xy += h->mb_stride){ |
507 | 197298 | LOCAL_ALIGNED(8, int16_t, bS, [4]); | |
508 | int qp; | ||
509 |
2/2✓ Branch 0 taken 106082 times.
✓ Branch 1 taken 91216 times.
|
197298 | if (IS_INTRA(mb_type | h->cur_pic.mb_type[mbn_xy])) { |
510 | 106082 | AV_WN64A(bS, 0x0003000300030003ULL); | |
511 | } else { | ||
512 |
4/4✓ Branch 0 taken 12308 times.
✓ Branch 1 taken 78908 times.
✓ Branch 2 taken 924 times.
✓ Branch 3 taken 11384 times.
|
91216 | 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 | 90292 | const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy] + 3*4; | |
519 | int i; | ||
520 |
2/2✓ Branch 0 taken 361168 times.
✓ Branch 1 taken 90292 times.
|
451460 | for( i = 0; i < 4; i++ ) { |
521 |
2/2✓ Branch 0 taken 139412 times.
✓ Branch 1 taken 221756 times.
|
361168 | 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 | 197298 | 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 789192 times.
✓ Branch 1 taken 197298 times.
|
986490 | { int i; for (i = 0; i < 4; i++) ff_tlog(h->avctx, " bS[%d]:%d", i, bS[i]); ff_tlog(h->avctx, "\n"); } |
530 | 197298 | filter_mb_edgeh( &img_y[j*linesize], tmp_linesize, bS, qp, a, b, h, 0 ); | |
531 | 197298 | 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 | 197298 | 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 197298 times.
✗ Branch 1 not taken.
|
197298 | if (chroma) { |
534 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 197298 times.
|
197298 | 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 | 197298 | filter_mb_edgech(&img_cb[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[0], a, b, h, 0); | |
539 | 197298 | filter_mb_edgech(&img_cr[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[1], a, b, h, 0); | |
540 | } | ||
541 | } | ||
542 | } | ||
543 | }else{ | ||
544 | 20301947 | LOCAL_ALIGNED(8, int16_t, bS, [4]); | |
545 | int qp; | ||
546 | |||
547 |
2/2✓ Branch 0 taken 6189136 times.
✓ Branch 1 taken 14112811 times.
|
20301947 | if( IS_INTRA(mb_type|mbm_type)) { |
548 | 6189136 | AV_WN64A(bS, 0x0003000300030003ULL); | |
549 |
2/2✓ Branch 0 taken 1402061 times.
✓ Branch 1 taken 4787075 times.
|
6189136 | if ( (!IS_INTERLACED(mb_type|mbm_type)) |
550 |
5/6✓ Branch 0 taken 1055754 times.
✓ Branch 1 taken 346307 times.
✓ Branch 2 taken 1055754 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 656847 times.
✓ Branch 5 taken 745214 times.
|
1402061 | || ((FRAME_MBAFF(h) || (h->picture_structure != PICT_FRAME)) && (dir == 0)) |
551 | ) | ||
552 | 5443922 | AV_WN64A(bS, 0x0004000400040004ULL); | |
553 | } else { | ||
554 | int i; | ||
555 | int mv_done; | ||
556 | |||
557 |
6/6✓ Branch 0 taken 7020807 times.
✓ Branch 1 taken 7092004 times.
✓ Branch 2 taken 676058 times.
✓ Branch 3 taken 6344749 times.
✓ Branch 4 taken 93979 times.
✓ Branch 5 taken 582079 times.
|
14112811 | if( dir && FRAME_MBAFF(h) && IS_INTERLACED(mb_type ^ mbm_type)) { |
558 | 93979 | AV_WN64A(bS, 0x0001000100010001ULL); | |
559 | 93979 | mv_done = 1; | |
560 | } | ||
561 |
4/4✓ Branch 0 taken 11211510 times.
✓ Branch 1 taken 2807322 times.
✓ Branch 2 taken 10284979 times.
✓ Branch 3 taken 926531 times.
|
14018832 | else if( mask_par0 && ((mbm_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) { |
562 | 10284979 | int b_idx= 8 + 4; | |
563 |
2/2✓ Branch 0 taken 5106251 times.
✓ Branch 1 taken 5178728 times.
|
10284979 | int bn_idx= b_idx - (dir ? 8:1); |
564 | |||
565 | 10284979 | bS[0] = bS[1] = bS[2] = bS[3] = check_mv(sl, 8 + 4, bn_idx, mvy_limit); | |
566 | 10284979 | mv_done = 1; | |
567 | } | ||
568 | else | ||
569 | 3733853 | mv_done = 0; | |
570 | |||
571 |
2/2✓ Branch 0 taken 56451244 times.
✓ Branch 1 taken 14112811 times.
|
70564055 | for( i = 0; i < 4; i++ ) { |
572 |
2/2✓ Branch 0 taken 28083228 times.
✓ Branch 1 taken 28368016 times.
|
56451244 | int x = dir == 0 ? 0 : i; |
573 |
2/2✓ Branch 0 taken 28368016 times.
✓ Branch 1 taken 28083228 times.
|
56451244 | int y = dir == 0 ? i : 0; |
574 | 56451244 | int b_idx= 8 + 4 + x + 8*y; | |
575 |
2/2✓ Branch 0 taken 28083228 times.
✓ Branch 1 taken 28368016 times.
|
56451244 | int bn_idx= b_idx - (dir ? 8:1); |
576 | |||
577 | 56451244 | if (sl->non_zero_count_cache[b_idx] | | |
578 |
2/2✓ Branch 0 taken 15477174 times.
✓ Branch 1 taken 40974070 times.
|
56451244 | sl->non_zero_count_cache[bn_idx]) { |
579 | 15477174 | bS[i] = 2; | |
580 | } | ||
581 |
2/2✓ Branch 0 taken 7355169 times.
✓ Branch 1 taken 33618901 times.
|
40974070 | else if(!mv_done) |
582 | { | ||
583 | 7355169 | 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 14241740 times.
✓ Branch 1 taken 6060207 times.
|
20301947 | if(bS[0]+bS[1]+bS[2]+bS[3]){ |
592 | 14241740 | 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 | 14241740 | 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 | 14241740 | 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 7076808 times.
✓ Branch 1 taken 7164932 times.
|
14241740 | if( dir == 0 ) { |
599 | 7076808 | filter_mb_edgev( &img_y[0], linesize, bS, qp, a, b, h, 1 ); | |
600 |
2/2✓ Branch 0 taken 7013780 times.
✓ Branch 1 taken 63028 times.
|
7076808 | if (chroma) { |
601 |
2/2✓ Branch 0 taken 31200 times.
✓ Branch 1 taken 6982580 times.
|
7013780 | 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 | 6982580 | filter_mb_edgecv( &img_cb[0], uvlinesize, bS, chroma_qp_avg[0], a, b, h, 1); | |
606 | 6982580 | filter_mb_edgecv( &img_cr[0], uvlinesize, bS, chroma_qp_avg[1], a, b, h, 1); | |
607 | } | ||
608 | } | ||
609 | } else { | ||
610 | 7164932 | filter_mb_edgeh( &img_y[0], linesize, bS, qp, a, b, h, 1 ); | |
611 |
2/2✓ Branch 0 taken 7102012 times.
✓ Branch 1 taken 62920 times.
|
7164932 | if (chroma) { |
612 |
2/2✓ Branch 0 taken 31199 times.
✓ Branch 1 taken 7070813 times.
|
7102012 | 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 | 7070813 | filter_mb_edgech( &img_cb[0], uvlinesize, bS, chroma_qp_avg[0], a, b, h, 1); | |
617 | 7070813 | 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 42259971 times.
✓ Branch 1 taken 21604154 times.
|
63864125 | for( edge = 1; edge < edges; edge++ ) { |
627 | 42259971 | LOCAL_ALIGNED(8, int16_t, bS, [4]); | |
628 | int qp; | ||
629 | 42259971 | const int deblock_edge = !IS_8x8DCT(mb_type & (edge<<24)); // (edge&1) && IS_8x8DCT(mb_type) | |
630 | |||
631 |
6/6✓ Branch 0 taken 7720564 times.
✓ Branch 1 taken 34539407 times.
✓ Branch 2 taken 1548276 times.
✓ Branch 3 taken 6172288 times.
✓ Branch 4 taken 774138 times.
✓ Branch 5 taken 774138 times.
|
42259971 | if (!deblock_edge && (!chroma422 || dir == 0)) |
632 | 11891883 | continue; | |
633 | |||
634 |
2/2✓ Branch 0 taken 13680166 times.
✓ Branch 1 taken 21633379 times.
|
35313545 | if( IS_INTRA(mb_type)) { |
635 | 13680166 | AV_WN64A(bS, 0x0003000300030003ULL); | |
636 | } else { | ||
637 | int i; | ||
638 | int mv_done; | ||
639 | |||
640 |
2/2✓ Branch 0 taken 13977325 times.
✓ Branch 1 taken 7656054 times.
|
21633379 | if( edge & mask_edge ) { |
641 | 13977325 | AV_ZERO64(bS); | |
642 | 13977325 | mv_done = 1; | |
643 | } | ||
644 |
2/2✓ Branch 0 taken 930944 times.
✓ Branch 1 taken 6725110 times.
|
7656054 | else if( mask_par0 ) { |
645 |
2/2✓ Branch 0 taken 482665 times.
✓ Branch 1 taken 448279 times.
|
930944 | int b_idx= 8 + 4 + edge * (dir ? 8:1); |
646 |
2/2✓ Branch 0 taken 482665 times.
✓ Branch 1 taken 448279 times.
|
930944 | int bn_idx= b_idx - (dir ? 8:1); |
647 | |||
648 | 930944 | bS[0] = bS[1] = bS[2] = bS[3] = check_mv(sl, b_idx, bn_idx, mvy_limit); | |
649 | 930944 | mv_done = 1; | |
650 | } | ||
651 | else | ||
652 | 6725110 | mv_done = 0; | |
653 | |||
654 |
2/2✓ Branch 0 taken 86533516 times.
✓ Branch 1 taken 21633379 times.
|
108166895 | for( i = 0; i < 4; i++ ) { |
655 |
2/2✓ Branch 0 taken 43253084 times.
✓ Branch 1 taken 43280432 times.
|
86533516 | int x = dir == 0 ? edge : i; |
656 |
2/2✓ Branch 0 taken 43253084 times.
✓ Branch 1 taken 43280432 times.
|
86533516 | int y = dir == 0 ? i : edge; |
657 | 86533516 | int b_idx= 8 + 4 + x + 8*y; | |
658 |
2/2✓ Branch 0 taken 43280432 times.
✓ Branch 1 taken 43253084 times.
|
86533516 | int bn_idx= b_idx - (dir ? 8:1); |
659 | |||
660 | 86533516 | if (sl->non_zero_count_cache[b_idx] | | |
661 |
2/2✓ Branch 0 taken 41730382 times.
✓ Branch 1 taken 44803134 times.
|
86533516 | sl->non_zero_count_cache[bn_idx]) { |
662 | 41730382 | bS[i] = 2; | |
663 | } | ||
664 |
2/2✓ Branch 0 taken 12805237 times.
✓ Branch 1 taken 31997897 times.
|
44803134 | else if(!mv_done) |
665 | { | ||
666 | 12805237 | bS[i] = check_mv(sl, b_idx, bn_idx, mvy_limit); | |
667 | } | ||
668 | } | ||
669 | |||
670 |
2/2✓ Branch 0 taken 4945457 times.
✓ Branch 1 taken 16687922 times.
|
21633379 | if(bS[0]+bS[1]+bS[2]+bS[3] == 0) |
671 | 4945457 | 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 | 30368088 | 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 14803860 times.
✓ Branch 1 taken 15564228 times.
|
30368088 | if( dir == 0 ) { |
682 | 14803860 | filter_mb_edgev( &img_y[4*edge << h->pixel_shift], linesize, bS, qp, a, b, h, 0 ); | |
683 |
2/2✓ Branch 0 taken 14674473 times.
✓ Branch 1 taken 129387 times.
|
14803860 | if (chroma) { |
684 |
2/2✓ Branch 0 taken 47636 times.
✓ Branch 1 taken 14626837 times.
|
14674473 | 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 6384216 times.
✓ Branch 1 taken 8242621 times.
|
14626837 | } else if( (edge&1) == 0 ) { |
688 | 6384216 | filter_mb_edgecv( &img_cb[2*edge << h->pixel_shift], uvlinesize, bS, sl->chroma_qp[0], a, b, h, 0); | |
689 | 6384216 | 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 13500061 times.
|
15564228 | 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 | 13500061 | filter_mb_edgeh(&img_y[4*edge*linesize], linesize, bS, qp, a, b, h, 0); | |
702 |
2/2✓ Branch 0 taken 13370931 times.
✓ Branch 1 taken 129130 times.
|
13500061 | if (chroma) { |
703 |
2/2✓ Branch 0 taken 47937 times.
✓ Branch 1 taken 13322994 times.
|
13370931 | 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 5678888 times.
✓ Branch 1 taken 7644106 times.
|
13322994 | } else if ((edge&1) == 0) { |
707 | 5678888 | filter_mb_edgech(&img_cb[2*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[0], a, b, h, 0); | |
708 | 5678888 | filter_mb_edgech(&img_cr[2*edge*uvlinesize], uvlinesize, bS, sl->chroma_qp[1], a, b, h, 0); | |
709 | } | ||
710 | } | ||
711 | } | ||
712 | } | ||
713 | } | ||
714 | 21604154 | } | |
715 | |||
716 | 10802077 | 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 | 10802077 | const int mb_xy= mb_x + mb_y*h->mb_stride; | |
722 | 10802077 | const int mb_type = h->cur_pic.mb_type[mb_xy]; | |
723 |
2/2✓ Branch 0 taken 3571926 times.
✓ Branch 1 taken 7230151 times.
|
10802077 | const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4; |
724 | 10802077 | int first_vertical_edge_done = 0; | |
725 | 10802077 | int chroma = CHROMA(h) && !(CONFIG_GRAY && (h->flags & AV_CODEC_FLAG_GRAY)); | |
726 | 10802077 | int qp_bd_offset = 6 * (h->ps.sps->bit_depth_luma - 8); | |
727 | 10802077 | int a = 52 + sl->slice_alpha_c0_offset - qp_bd_offset; | |
728 | 10802077 | int b = 52 + sl->slice_beta_offset - qp_bd_offset; | |
729 | |||
730 |
2/2✓ Branch 0 taken 1730309 times.
✓ Branch 1 taken 9071768 times.
|
10802077 | if (FRAME_MBAFF(h) |
731 | // and current and left pair do not have the same interlaced type | ||
732 |
2/2✓ Branch 0 taken 372526 times.
✓ Branch 1 taken 1357783 times.
|
1730309 | && IS_INTERLACED(mb_type ^ sl->left_type[LTOP]) |
733 | // and left mb is in available to us | ||
734 |
2/2✓ Branch 0 taken 363202 times.
✓ Branch 1 taken 9324 times.
|
372526 | && 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 | 363202 | 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 | 363202 | first_vertical_edge_done = 1; | |
745 | |||
746 |
2/2✓ Branch 0 taken 169941 times.
✓ Branch 1 taken 193261 times.
|
363202 | if( IS_INTRA(mb_type) ) { |
747 | 169941 | AV_WN64A(&bS[0], 0x0004000400040004ULL); | |
748 | 169941 | 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 | 193261 | const uint8_t *off= offset[MB_FIELD(sl)][mb_y&1]; | |
760 |
2/2✓ Branch 0 taken 1546088 times.
✓ Branch 1 taken 193261 times.
|
1739349 | for( i = 0; i < 8; i++ ) { |
761 |
2/2✓ Branch 0 taken 806656 times.
✓ Branch 1 taken 739432 times.
|
1546088 | int j= MB_FIELD(sl) ? i>>2 : i&1; |
762 | 1546088 | int mbn_xy = sl->left_mb_xy[LEFT(j)]; | |
763 | 1546088 | int mbn_type = sl->left_type[LEFT(j)]; | |
764 | |||
765 |
2/2✓ Branch 0 taken 171356 times.
✓ Branch 1 taken 1374732 times.
|
1546088 | if( IS_INTRA( mbn_type ) ) |
766 | 171356 | bS[i] = 4; | |
767 | else{ | ||
768 |
2/2✓ Branch 0 taken 557698 times.
✓ Branch 1 taken 817034 times.
|
1374732 | 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 1131232 times.
|
1405768 | : |
772 | 1343696 | h->non_zero_count[mbn_xy][ off[i] ])); | |
773 | } | ||
774 | } | ||
775 | } | ||
776 | |||
777 | 363202 | mb_qp = h->cur_pic.qscale_table[mb_xy]; | |
778 | 363202 | mbn0_qp = h->cur_pic.qscale_table[sl->left_mb_xy[0]]; | |
779 | 363202 | mbn1_qp = h->cur_pic.qscale_table[sl->left_mb_xy[1]]; | |
780 | 363202 | qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1; | |
781 | 363202 | bqp[0] = (get_chroma_qp(h->ps.pps, 0, mb_qp) + | |
782 | 363202 | get_chroma_qp(h->ps.pps, 0, mbn0_qp) + 1) >> 1; | |
783 | 363202 | rqp[0] = (get_chroma_qp(h->ps.pps, 1, mb_qp) + | |
784 | 363202 | get_chroma_qp(h->ps.pps, 1, mbn0_qp) + 1) >> 1; | |
785 | 363202 | qp[1] = ( mb_qp + mbn1_qp + 1 ) >> 1; | |
786 | 363202 | bqp[1] = (get_chroma_qp(h->ps.pps, 0, mb_qp) + | |
787 | 363202 | get_chroma_qp(h->ps.pps, 0, mbn1_qp) + 1 ) >> 1; | |
788 | 363202 | rqp[1] = (get_chroma_qp(h->ps.pps, 1, mb_qp) + | |
789 | 363202 | 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 2905616 times.
✓ Branch 1 taken 363202 times.
|
3268818 | { 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 182421 times.
✓ Branch 1 taken 180781 times.
|
363202 | if (MB_FIELD(sl)) { |
795 | 182421 | filter_mb_mbaff_edgev ( h, img_y , linesize, bS , 1, qp [0], a, b, 1 ); | |
796 | 182421 | filter_mb_mbaff_edgev ( h, img_y + 8* linesize, linesize, bS+4, 1, qp [1], a, b, 1 ); | |
797 |
1/2✓ Branch 0 taken 182421 times.
✗ Branch 1 not taken.
|
182421 | if (chroma){ |
798 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 182421 times.
|
182421 | 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 154637 times.
|
182421 | } 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 | 154637 | filter_mb_mbaff_edgecv( h, img_cb, uvlinesize, bS , 1, bqp[0], a, b, 1 ); | |
810 | 154637 | filter_mb_mbaff_edgecv( h, img_cb + 4*uvlinesize, uvlinesize, bS+4, 1, bqp[1], a, b, 1 ); | |
811 | 154637 | filter_mb_mbaff_edgecv( h, img_cr, uvlinesize, bS , 1, rqp[0], a, b, 1 ); | |
812 | 154637 | filter_mb_mbaff_edgecv( h, img_cr + 4*uvlinesize, uvlinesize, bS+4, 1, rqp[1], a, b, 1 ); | |
813 | } | ||
814 | } | ||
815 | }else{ | ||
816 | 180781 | filter_mb_mbaff_edgev ( h, img_y , 2* linesize, bS , 2, qp [0], a, b, 1 ); | |
817 | 180781 | filter_mb_mbaff_edgev ( h, img_y + linesize, 2* linesize, bS+1, 2, qp [1], a, b, 1 ); | |
818 |
1/2✓ Branch 0 taken 180781 times.
✗ Branch 1 not taken.
|
180781 | if (chroma){ |
819 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 180781 times.
|
180781 | 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 | 180781 | filter_mb_mbaff_edgecv( h, img_cb, 2*uvlinesize, bS , 2, bqp[0], a, b, 1 ); | |
826 | 180781 | filter_mb_mbaff_edgecv( h, img_cb + uvlinesize, 2*uvlinesize, bS+1, 2, bqp[1], a, b, 1 ); | |
827 | 180781 | filter_mb_mbaff_edgecv( h, img_cr, 2*uvlinesize, bS , 2, rqp[0], a, b, 1 ); | |
828 | 180781 | 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 | 10802077 | 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 | 10802077 | 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 | 10802077 | } | |
848 |