2 * H.26L/H.264/AVC/JVT/14496-10/... loop filter
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * H.264 / AVC / MPEG4 part10 loop filter.
25 * @author Michael Niedermayer <michaelni@gmx.at>
28 #include "libavutil/internal.h"
29 #include "libavutil/intreadwrite.h"
32 #include "mpegvideo.h"
35 #include "rectangle.h"
40 /* Deblocking filter (p153) */
41 static const uint8_t alpha_table
[52*3] = {
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
46 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47 0, 0, 0, 0, 0, 0, 4, 4, 5, 6,
48 7, 8, 9, 10, 12, 13, 15, 17, 20, 22,
49 25, 28, 32, 36, 40, 45, 50, 56, 63, 71,
50 80, 90,101,113,127,144,162,182,203,226,
52 255,255,255,255,255,255,255,255,255,255,255,255,255,
53 255,255,255,255,255,255,255,255,255,255,255,255,255,
54 255,255,255,255,255,255,255,255,255,255,255,255,255,
55 255,255,255,255,255,255,255,255,255,255,255,255,255,
57 static const uint8_t beta_table
[52*3] = {
58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 0, 0, 0, 0, 0, 2, 2, 2, 3,
64 3, 3, 3, 4, 4, 4, 6, 6, 7, 7,
65 8, 8, 9, 9, 10, 10, 11, 11, 12, 12,
66 13, 13, 14, 14, 15, 15, 16, 16, 17, 17,
68 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
69 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
70 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
71 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
73 static const uint8_t tc0_table
[52*3][4] = {
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 }, {-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, 0 },
82 {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },
83 {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },
84 {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },
85 {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 1 },
86 {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 1, 1 }, {-1, 0, 1, 1 }, {-1, 1, 1, 1 },
87 {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 },
88 {-1, 1, 1, 2 }, {-1, 1, 2, 3 }, {-1, 1, 2, 3 }, {-1, 2, 2, 3 }, {-1, 2, 2, 4 }, {-1, 2, 3, 4 },
89 {-1, 2, 3, 4 }, {-1, 3, 3, 5 }, {-1, 3, 4, 6 }, {-1, 3, 4, 6 }, {-1, 4, 5, 7 }, {-1, 4, 5, 8 },
90 {-1, 4, 6, 9 }, {-1, 5, 7,10 }, {-1, 6, 8,11 }, {-1, 6, 8,13 }, {-1, 7,10,14 }, {-1, 8,11,16 },
91 {-1, 9,12,18 }, {-1,10,13,20 }, {-1,11,15,23 }, {-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 }, {-1,13,17,25 }, {-1,13,17,25 },
97 {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },
98 {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },
99 {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },
100 {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },
103 /* intra: 0 if this loopfilter call is guaranteed to be inter (bS < 4), 1 if it might be intra (bS == 4) */
104 static av_always_inline
void filter_mb_edgev(uint8_t *pix
, int stride
,
106 unsigned int qp
, int a
, int b
,
107 H264Context
*h
, int intra
)
109 const unsigned int index_a
= qp
+ a
;
110 const int alpha
= alpha_table
[index_a
];
111 const int beta
= beta_table
[qp
+ b
];
112 if (alpha
==0 || beta
== 0) return;
114 if( bS
[0] < 4 || !intra
) {
116 tc
[0] = tc0_table
[index_a
][bS
[0]];
117 tc
[1] = tc0_table
[index_a
][bS
[1]];
118 tc
[2] = tc0_table
[index_a
][bS
[2]];
119 tc
[3] = tc0_table
[index_a
][bS
[3]];
120 h
->h264dsp
.h264_h_loop_filter_luma(pix
, stride
, alpha
, beta
, tc
);
122 h
->h264dsp
.h264_h_loop_filter_luma_intra(pix
, stride
, alpha
, beta
);
126 static av_always_inline
void filter_mb_edgecv(uint8_t *pix
, int stride
,
128 unsigned int qp
, int a
, int b
,
129 H264Context
*h
, int intra
)
131 const unsigned int index_a
= qp
+ a
;
132 const int alpha
= alpha_table
[index_a
];
133 const int beta
= beta_table
[qp
+ b
];
134 if (alpha
==0 || beta
== 0) return;
136 if( bS
[0] < 4 || !intra
) {
138 tc
[0] = tc0_table
[index_a
][bS
[0]]+1;
139 tc
[1] = tc0_table
[index_a
][bS
[1]]+1;
140 tc
[2] = tc0_table
[index_a
][bS
[2]]+1;
141 tc
[3] = tc0_table
[index_a
][bS
[3]]+1;
142 h
->h264dsp
.h264_h_loop_filter_chroma(pix
, stride
, alpha
, beta
, tc
);
144 h
->h264dsp
.h264_h_loop_filter_chroma_intra(pix
, stride
, alpha
, beta
);
148 static av_always_inline
void filter_mb_mbaff_edgev(H264Context
*h
, uint8_t *pix
,
150 const int16_t bS
[7], int bsi
,
151 int qp
, int a
, int b
,
154 const unsigned int index_a
= qp
+ a
;
155 const int alpha
= alpha_table
[index_a
];
156 const int beta
= beta_table
[qp
+ b
];
157 if (alpha
==0 || beta
== 0) return;
159 if( bS
[0] < 4 || !intra
) {
161 tc
[0] = tc0_table
[index_a
][bS
[0*bsi
]];
162 tc
[1] = tc0_table
[index_a
][bS
[1*bsi
]];
163 tc
[2] = tc0_table
[index_a
][bS
[2*bsi
]];
164 tc
[3] = tc0_table
[index_a
][bS
[3*bsi
]];
165 h
->h264dsp
.h264_h_loop_filter_luma_mbaff(pix
, stride
, alpha
, beta
, tc
);
167 h
->h264dsp
.h264_h_loop_filter_luma_mbaff_intra(pix
, stride
, alpha
, beta
);
171 static av_always_inline
void filter_mb_mbaff_edgecv(H264Context
*h
,
172 uint8_t *pix
, int stride
,
174 int bsi
, int qp
, int a
,
177 const unsigned int index_a
= qp
+ a
;
178 const int alpha
= alpha_table
[index_a
];
179 const int beta
= beta_table
[qp
+ b
];
180 if (alpha
==0 || beta
== 0) return;
182 if( bS
[0] < 4 || !intra
) {
184 tc
[0] = tc0_table
[index_a
][bS
[0*bsi
]] + 1;
185 tc
[1] = tc0_table
[index_a
][bS
[1*bsi
]] + 1;
186 tc
[2] = tc0_table
[index_a
][bS
[2*bsi
]] + 1;
187 tc
[3] = tc0_table
[index_a
][bS
[3*bsi
]] + 1;
188 h
->h264dsp
.h264_h_loop_filter_chroma_mbaff(pix
, stride
, alpha
, beta
, tc
);
190 h
->h264dsp
.h264_h_loop_filter_chroma_mbaff_intra(pix
, stride
, alpha
, beta
);
194 static av_always_inline
void filter_mb_edgeh(uint8_t *pix
, int stride
,
196 unsigned int qp
, int a
, int b
,
197 H264Context
*h
, int intra
)
199 const unsigned int index_a
= qp
+ a
;
200 const int alpha
= alpha_table
[index_a
];
201 const int beta
= beta_table
[qp
+ b
];
202 if (alpha
==0 || beta
== 0) return;
204 if( bS
[0] < 4 || !intra
) {
206 tc
[0] = tc0_table
[index_a
][bS
[0]];
207 tc
[1] = tc0_table
[index_a
][bS
[1]];
208 tc
[2] = tc0_table
[index_a
][bS
[2]];
209 tc
[3] = tc0_table
[index_a
][bS
[3]];
210 h
->h264dsp
.h264_v_loop_filter_luma(pix
, stride
, alpha
, beta
, tc
);
212 h
->h264dsp
.h264_v_loop_filter_luma_intra(pix
, stride
, alpha
, beta
);
216 static av_always_inline
void filter_mb_edgech(uint8_t *pix
, int stride
,
218 unsigned int qp
, int a
, int b
,
219 H264Context
*h
, int intra
)
221 const unsigned int index_a
= qp
+ a
;
222 const int alpha
= alpha_table
[index_a
];
223 const int beta
= beta_table
[qp
+ b
];
224 if (alpha
==0 || beta
== 0) return;
226 if( bS
[0] < 4 || !intra
) {
228 tc
[0] = tc0_table
[index_a
][bS
[0]]+1;
229 tc
[1] = tc0_table
[index_a
][bS
[1]]+1;
230 tc
[2] = tc0_table
[index_a
][bS
[2]]+1;
231 tc
[3] = tc0_table
[index_a
][bS
[3]]+1;
232 h
->h264dsp
.h264_v_loop_filter_chroma(pix
, stride
, alpha
, beta
, tc
);
234 h
->h264dsp
.h264_v_loop_filter_chroma_intra(pix
, stride
, alpha
, beta
);
238 static av_always_inline
void h264_filter_mb_fast_internal(H264Context
*h
,
243 unsigned int linesize
,
244 unsigned int uvlinesize
,
247 int chroma
= !(CONFIG_GRAY
&& (h
->flags
&CODEC_FLAG_GRAY
));
248 int chroma444
= CHROMA444
;
249 int chroma422
= CHROMA422
;
251 int mb_xy
= h
->mb_xy
;
252 int left_type
= h
->left_type
[LTOP
];
253 int top_type
= h
->top_type
;
255 int qp_bd_offset
= 6 * (h
->sps
.bit_depth_luma
- 8);
256 int a
= h
->slice_alpha_c0_offset
- qp_bd_offset
;
257 int b
= h
->slice_beta_offset
- qp_bd_offset
;
259 int mb_type
= h
->cur_pic
.mb_type
[mb_xy
];
260 int qp
= h
->cur_pic
.qscale_table
[mb_xy
];
261 int qp0
= h
->cur_pic
.qscale_table
[mb_xy
- 1];
262 int qp1
= h
->cur_pic
.qscale_table
[h
->top_mb_xy
];
263 int qpc
= get_chroma_qp( h
, 0, qp
);
264 int qpc0
= get_chroma_qp( h
, 0, qp0
);
265 int qpc1
= get_chroma_qp( h
, 0, qp1
);
266 qp0
= (qp
+ qp0
+ 1) >> 1;
267 qp1
= (qp
+ qp1
+ 1) >> 1;
268 qpc0
= (qpc
+ qpc0
+ 1) >> 1;
269 qpc1
= (qpc
+ qpc1
+ 1) >> 1;
271 if( IS_INTRA(mb_type
) ) {
272 static const int16_t bS4
[4] = {4,4,4,4};
273 static const int16_t bS3
[4] = {3,3,3,3};
274 const int16_t *bSH
= FIELD_PICTURE
? bS3
: bS4
;
276 filter_mb_edgev( &img_y
[4*0<<pixel_shift
], linesize
, bS4
, qp0
, a
, b
, h
, 1);
277 if( IS_8x8DCT(mb_type
) ) {
278 filter_mb_edgev( &img_y
[4*2<<pixel_shift
], linesize
, bS3
, qp
, a
, b
, h
, 0);
280 filter_mb_edgeh( &img_y
[4*0*linesize
], linesize
, bSH
, qp1
, a
, b
, h
, 1);
282 filter_mb_edgeh( &img_y
[4*2*linesize
], linesize
, bS3
, qp
, a
, b
, h
, 0);
284 filter_mb_edgev( &img_y
[4*1<<pixel_shift
], linesize
, bS3
, qp
, a
, b
, h
, 0);
285 filter_mb_edgev( &img_y
[4*2<<pixel_shift
], linesize
, bS3
, qp
, a
, b
, h
, 0);
286 filter_mb_edgev( &img_y
[4*3<<pixel_shift
], linesize
, bS3
, qp
, a
, b
, h
, 0);
288 filter_mb_edgeh( &img_y
[4*0*linesize
], linesize
, bSH
, qp1
, a
, b
, h
, 1);
290 filter_mb_edgeh( &img_y
[4*1*linesize
], linesize
, bS3
, qp
, a
, b
, h
, 0);
291 filter_mb_edgeh( &img_y
[4*2*linesize
], linesize
, bS3
, qp
, a
, b
, h
, 0);
292 filter_mb_edgeh( &img_y
[4*3*linesize
], linesize
, bS3
, qp
, a
, b
, h
, 0);
297 filter_mb_edgev( &img_cb
[4*0<<pixel_shift
], linesize
, bS4
, qpc0
, a
, b
, h
, 1);
298 filter_mb_edgev( &img_cr
[4*0<<pixel_shift
], linesize
, bS4
, qpc0
, a
, b
, h
, 1);
300 if( IS_8x8DCT(mb_type
) ) {
301 filter_mb_edgev( &img_cb
[4*2<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
302 filter_mb_edgev( &img_cr
[4*2<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
304 filter_mb_edgeh( &img_cb
[4*0*linesize
], linesize
, bSH
, qpc1
, a
, b
, h
, 1 );
305 filter_mb_edgeh( &img_cr
[4*0*linesize
], linesize
, bSH
, qpc1
, a
, b
, h
, 1 );
307 filter_mb_edgeh( &img_cb
[4*2*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
308 filter_mb_edgeh( &img_cr
[4*2*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
310 filter_mb_edgev( &img_cb
[4*1<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
311 filter_mb_edgev( &img_cr
[4*1<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
312 filter_mb_edgev( &img_cb
[4*2<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
313 filter_mb_edgev( &img_cr
[4*2<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
314 filter_mb_edgev( &img_cb
[4*3<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
315 filter_mb_edgev( &img_cr
[4*3<<pixel_shift
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
317 filter_mb_edgeh( &img_cb
[4*0*linesize
], linesize
, bSH
, qpc1
, a
, b
, h
, 1);
318 filter_mb_edgeh( &img_cr
[4*0*linesize
], linesize
, bSH
, qpc1
, a
, b
, h
, 1);
320 filter_mb_edgeh( &img_cb
[4*1*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
321 filter_mb_edgeh( &img_cr
[4*1*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
322 filter_mb_edgeh( &img_cb
[4*2*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
323 filter_mb_edgeh( &img_cr
[4*2*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
324 filter_mb_edgeh( &img_cb
[4*3*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
325 filter_mb_edgeh( &img_cr
[4*3*linesize
], linesize
, bS3
, qpc
, a
, b
, h
, 0);
329 filter_mb_edgecv(&img_cb
[2*0<<pixel_shift
], uvlinesize
, bS4
, qpc0
, a
, b
, h
, 1);
330 filter_mb_edgecv(&img_cr
[2*0<<pixel_shift
], uvlinesize
, bS4
, qpc0
, a
, b
, h
, 1);
332 filter_mb_edgecv(&img_cb
[2*2<<pixel_shift
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
333 filter_mb_edgecv(&img_cr
[2*2<<pixel_shift
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
335 filter_mb_edgech(&img_cb
[4*0*uvlinesize
], uvlinesize
, bSH
, qpc1
, a
, b
, h
, 1);
336 filter_mb_edgech(&img_cr
[4*0*uvlinesize
], uvlinesize
, bSH
, qpc1
, a
, b
, h
, 1);
338 filter_mb_edgech(&img_cb
[4*1*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
339 filter_mb_edgech(&img_cr
[4*1*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
340 filter_mb_edgech(&img_cb
[4*2*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
341 filter_mb_edgech(&img_cr
[4*2*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
342 filter_mb_edgech(&img_cb
[4*3*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
343 filter_mb_edgech(&img_cr
[4*3*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
346 filter_mb_edgecv( &img_cb
[2*0<<pixel_shift
], uvlinesize
, bS4
, qpc0
, a
, b
, h
, 1);
347 filter_mb_edgecv( &img_cr
[2*0<<pixel_shift
], uvlinesize
, bS4
, qpc0
, a
, b
, h
, 1);
349 filter_mb_edgecv( &img_cb
[2*2<<pixel_shift
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
350 filter_mb_edgecv( &img_cr
[2*2<<pixel_shift
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
352 filter_mb_edgech( &img_cb
[2*0*uvlinesize
], uvlinesize
, bSH
, qpc1
, a
, b
, h
, 1);
353 filter_mb_edgech( &img_cr
[2*0*uvlinesize
], uvlinesize
, bSH
, qpc1
, a
, b
, h
, 1);
355 filter_mb_edgech( &img_cb
[2*2*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
356 filter_mb_edgech( &img_cr
[2*2*uvlinesize
], uvlinesize
, bS3
, qpc
, a
, b
, h
, 0);
361 LOCAL_ALIGNED_8(int16_t, bS
, [2], [4][4]);
363 if( IS_8x8DCT(mb_type
) && (h
->cbp
&7) == 7 && !chroma444
) {
365 AV_WN64A(bS
[0][0], 0x0002000200020002ULL
);
366 AV_WN64A(bS
[0][2], 0x0002000200020002ULL
);
367 AV_WN64A(bS
[1][0], 0x0002000200020002ULL
);
368 AV_WN64A(bS
[1][2], 0x0002000200020002ULL
);
370 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;
371 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;
372 int step
= 1+(mb_type
>>24); //IS_8x8DCT(mb_type) ? 2 : 1;
373 edges
= 4 - 3*((mb_type
>>3) & !(h
->cbp
& 15)); //(mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4;
374 h
->h264dsp
.h264_loop_filter_strength( bS
, h
->non_zero_count_cache
, h
->ref_cache
, h
->mv_cache
,
375 h
->list_count
==2, edges
, step
, mask_edge0
, mask_edge1
, FIELD_PICTURE
);
377 if( IS_INTRA(left_type
) )
378 AV_WN64A(bS
[0][0], 0x0004000400040004ULL
);
379 if( IS_INTRA(top_type
) )
380 AV_WN64A(bS
[1][0], FIELD_PICTURE
? 0x0003000300030003ULL
: 0x0004000400040004ULL
);
382 #define FILTER(hv,dir,edge,intra)\
383 if(AV_RN64A(bS[dir][edge])) { \
384 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 );\
387 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 );\
388 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 );\
389 } else if(!(edge&1)) {\
390 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 );\
391 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 );\
400 } else if( IS_8x8DCT(mb_type
) ) {
419 void ff_h264_filter_mb_fast( H264Context
*h
, int mb_x
, int mb_y
, uint8_t *img_y
, uint8_t *img_cb
, uint8_t *img_cr
, unsigned int linesize
, unsigned int uvlinesize
) {
420 assert(!FRAME_MBAFF
);
421 if(!h
->h264dsp
.h264_loop_filter_strength
|| h
->pps
.chroma_qp_diff
) {
422 ff_h264_filter_mb(h
, mb_x
, mb_y
, img_y
, img_cb
, img_cr
, linesize
, uvlinesize
);
427 h264_filter_mb_fast_internal(h
, mb_x
, mb_y
, img_y
, img_cb
, img_cr
, linesize
, uvlinesize
, h
->pixel_shift
);
430 h264_filter_mb_fast_internal(h
, mb_x
, mb_y
, img_y
, img_cb
, img_cr
, linesize
, uvlinesize
, 1);
432 h264_filter_mb_fast_internal(h
, mb_x
, mb_y
, img_y
, img_cb
, img_cr
, linesize
, uvlinesize
, 0);
437 static int check_mv(H264Context
*h
, long b_idx
, long bn_idx
, int mvy_limit
){
440 v
= h
->ref_cache
[0][b_idx
] != h
->ref_cache
[0][bn_idx
];
441 if(!v
&& h
->ref_cache
[0][b_idx
]!=-1)
442 v
= h
->mv_cache
[0][b_idx
][0] - h
->mv_cache
[0][bn_idx
][0] + 3 >= 7U |
443 FFABS( h
->mv_cache
[0][b_idx
][1] - h
->mv_cache
[0][bn_idx
][1] ) >= mvy_limit
;
445 if(h
->list_count
==2){
447 v
= h
->ref_cache
[1][b_idx
] != h
->ref_cache
[1][bn_idx
] |
448 h
->mv_cache
[1][b_idx
][0] - h
->mv_cache
[1][bn_idx
][0] + 3 >= 7U |
449 FFABS( h
->mv_cache
[1][b_idx
][1] - h
->mv_cache
[1][bn_idx
][1] ) >= mvy_limit
;
452 if(h
->ref_cache
[0][b_idx
] != h
->ref_cache
[1][bn_idx
] |
453 h
->ref_cache
[1][b_idx
] != h
->ref_cache
[0][bn_idx
])
456 h
->mv_cache
[0][b_idx
][0] - h
->mv_cache
[1][bn_idx
][0] + 3 >= 7U |
457 FFABS( h
->mv_cache
[0][b_idx
][1] - h
->mv_cache
[1][bn_idx
][1] ) >= mvy_limit
|
458 h
->mv_cache
[1][b_idx
][0] - h
->mv_cache
[0][bn_idx
][0] + 3 >= 7U |
459 FFABS( h
->mv_cache
[1][b_idx
][1] - h
->mv_cache
[0][bn_idx
][1] ) >= mvy_limit
;
466 static av_always_inline
void filter_mb_dir(H264Context
*h
, int mb_x
, int mb_y
, uint8_t *img_y
, uint8_t *img_cb
, uint8_t *img_cr
, unsigned int linesize
, unsigned int uvlinesize
, int mb_xy
, int mb_type
, int mvy_limit
, int first_vertical_edge_done
, int a
, int b
, int chroma
, int dir
) {
468 int chroma_qp_avg
[2];
469 int chroma444
= CHROMA444
;
470 int chroma422
= CHROMA422
;
471 const int mbm_xy
= dir
== 0 ? mb_xy
-1 : h
->top_mb_xy
;
472 const int mbm_type
= dir
== 0 ? h
->left_type
[LTOP
] : h
->top_type
;
474 // how often to recheck mv-based bS when iterating between edges
475 static const uint8_t mask_edge_tab
[2][8]={{0,3,3,3,1,1,1,1},
477 const int mask_edge
= mask_edge_tab
[dir
][(mb_type
>>3)&7];
478 const int edges
= mask_edge
== 3 && !(h
->cbp
&15) ? 1 : 4;
480 // how often to recheck mv-based bS when iterating along each edge
481 const int mask_par0
= mb_type
& (MB_TYPE_16x16
| (MB_TYPE_8x16
>> dir
));
483 if(mbm_type
&& !first_vertical_edge_done
){
485 if (FRAME_MBAFF
&& (dir
== 1) && ((mb_y
&1) == 0)
486 && IS_INTERLACED(mbm_type
&~mb_type
)
488 // This is a special case in the norm where the filtering must
489 // be done twice (one each of the field) even if we are in a
492 unsigned int tmp_linesize
= 2 * linesize
;
493 unsigned int tmp_uvlinesize
= 2 * uvlinesize
;
494 int mbn_xy
= mb_xy
- 2 * h
->mb_stride
;
497 for(j
=0; j
<2; j
++, mbn_xy
+= h
->mb_stride
){
498 DECLARE_ALIGNED(8, int16_t, bS
)[4];
500 if (IS_INTRA(mb_type
| h
->cur_pic
.mb_type
[mbn_xy
])) {
501 AV_WN64A(bS
, 0x0003000300030003ULL
);
503 if (!CABAC
&& IS_8x8DCT(h
->cur_pic
.mb_type
[mbn_xy
])) {
504 bS
[0]= 1+((h
->cbp_table
[mbn_xy
] & 0x4000)||h
->non_zero_count_cache
[scan8
[0]+0]);
505 bS
[1]= 1+((h
->cbp_table
[mbn_xy
] & 0x4000)||h
->non_zero_count_cache
[scan8
[0]+1]);
506 bS
[2]= 1+((h
->cbp_table
[mbn_xy
] & 0x8000)||h
->non_zero_count_cache
[scan8
[0]+2]);
507 bS
[3]= 1+((h
->cbp_table
[mbn_xy
] & 0x8000)||h
->non_zero_count_cache
[scan8
[0]+3]);
509 const uint8_t *mbn_nnz
= h
->non_zero_count
[mbn_xy
] + 3*4;
511 for( i
= 0; i
< 4; i
++ ) {
512 bS
[i
] = 1 + !!(h
->non_zero_count_cache
[scan8
[0]+i
] | mbn_nnz
[i
]);
516 // Do not use s->qscale as luma quantizer because it has not the same
517 // value in IPCM macroblocks.
518 qp
= (h
->cur_pic
.qscale_table
[mb_xy
] + h
->cur_pic
.qscale_table
[mbn_xy
] + 1) >> 1;
519 tprintf(h
->avctx
, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x
, mb_y
, dir
, edge
, qp
, tmp_linesize
, tmp_uvlinesize
);
520 { int i
; for (i
= 0; i
< 4; i
++) tprintf(h
->avctx
, " bS[%d]:%d", i
, bS
[i
]); tprintf(h
->avctx
, "\n"); }
521 filter_mb_edgeh( &img_y
[j
*linesize
], tmp_linesize
, bS
, qp
, a
, b
, h
, 0 );
522 chroma_qp_avg
[0] = (h
->chroma_qp
[0] + get_chroma_qp(h
, 0, h
->cur_pic
.qscale_table
[mbn_xy
]) + 1) >> 1;
523 chroma_qp_avg
[1] = (h
->chroma_qp
[1] + get_chroma_qp(h
, 1, h
->cur_pic
.qscale_table
[mbn_xy
]) + 1) >> 1;
526 filter_mb_edgeh (&img_cb
[j
*uvlinesize
], tmp_uvlinesize
, bS
, chroma_qp_avg
[0], a
, b
, h
, 0);
527 filter_mb_edgeh (&img_cr
[j
*uvlinesize
], tmp_uvlinesize
, bS
, chroma_qp_avg
[1], a
, b
, h
, 0);
529 filter_mb_edgech(&img_cb
[j
*uvlinesize
], tmp_uvlinesize
, bS
, chroma_qp_avg
[0], a
, b
, h
, 0);
530 filter_mb_edgech(&img_cr
[j
*uvlinesize
], tmp_uvlinesize
, bS
, chroma_qp_avg
[1], a
, b
, h
, 0);
535 DECLARE_ALIGNED(8, int16_t, bS
)[4];
538 if( IS_INTRA(mb_type
|mbm_type
)) {
539 AV_WN64A(bS
, 0x0003000300030003ULL
);
540 if ( (!IS_INTERLACED(mb_type
|mbm_type
))
541 || ((FRAME_MBAFF
|| (h
->picture_structure
!= PICT_FRAME
)) && (dir
== 0))
543 AV_WN64A(bS
, 0x0004000400040004ULL
);
548 if( dir
&& FRAME_MBAFF
&& IS_INTERLACED(mb_type
^ mbm_type
)) {
549 AV_WN64A(bS
, 0x0001000100010001ULL
);
552 else if( mask_par0
&& ((mbm_type
& (MB_TYPE_16x16
| (MB_TYPE_8x16
>> dir
)))) ) {
554 int bn_idx
= b_idx
- (dir
? 8:1);
556 bS
[0] = bS
[1] = bS
[2] = bS
[3] = check_mv(h
, 8 + 4, bn_idx
, mvy_limit
);
562 for( i
= 0; i
< 4; i
++ ) {
563 int x
= dir
== 0 ? 0 : i
;
564 int y
= dir
== 0 ? i
: 0;
565 int b_idx
= 8 + 4 + x
+ 8*y
;
566 int bn_idx
= b_idx
- (dir
? 8:1);
568 if( h
->non_zero_count_cache
[b_idx
] |
569 h
->non_zero_count_cache
[bn_idx
] ) {
574 bS
[i
] = check_mv(h
, b_idx
, bn_idx
, mvy_limit
);
580 // Do not use s->qscale as luma quantizer because it has not the same
581 // value in IPCM macroblocks.
582 if(bS
[0]+bS
[1]+bS
[2]+bS
[3]){
583 qp
= (h
->cur_pic
.qscale_table
[mb_xy
] + h
->cur_pic
.qscale_table
[mbm_xy
] + 1) >> 1;
584 tprintf(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
);
585 chroma_qp_avg
[0] = (h
->chroma_qp
[0] + get_chroma_qp(h
, 0, h
->cur_pic
.qscale_table
[mbm_xy
]) + 1) >> 1;
586 chroma_qp_avg
[1] = (h
->chroma_qp
[1] + get_chroma_qp(h
, 1, h
->cur_pic
.qscale_table
[mbm_xy
]) + 1) >> 1;
588 filter_mb_edgev( &img_y
[0], linesize
, bS
, qp
, a
, b
, h
, 1 );
591 filter_mb_edgev ( &img_cb
[0], uvlinesize
, bS
, chroma_qp_avg
[0], a
, b
, h
, 1);
592 filter_mb_edgev ( &img_cr
[0], uvlinesize
, bS
, chroma_qp_avg
[1], a
, b
, h
, 1);
594 filter_mb_edgecv( &img_cb
[0], uvlinesize
, bS
, chroma_qp_avg
[0], a
, b
, h
, 1);
595 filter_mb_edgecv( &img_cr
[0], uvlinesize
, bS
, chroma_qp_avg
[1], a
, b
, h
, 1);
599 filter_mb_edgeh( &img_y
[0], linesize
, bS
, qp
, a
, b
, h
, 1 );
602 filter_mb_edgeh ( &img_cb
[0], uvlinesize
, bS
, chroma_qp_avg
[0], a
, b
, h
, 1);
603 filter_mb_edgeh ( &img_cr
[0], uvlinesize
, bS
, chroma_qp_avg
[1], a
, b
, h
, 1);
605 filter_mb_edgech( &img_cb
[0], uvlinesize
, bS
, chroma_qp_avg
[0], a
, b
, h
, 1);
606 filter_mb_edgech( &img_cr
[0], uvlinesize
, bS
, chroma_qp_avg
[1], a
, b
, h
, 1);
615 for( edge
= 1; edge
< edges
; edge
++ ) {
616 DECLARE_ALIGNED(8, int16_t, bS
)[4];
618 const int deblock_edge
= !IS_8x8DCT(mb_type
& (edge
<<24)); // (edge&1) && IS_8x8DCT(mb_type)
620 if (!deblock_edge
&& (!chroma422
|| dir
== 0))
623 if( IS_INTRA(mb_type
)) {
624 AV_WN64A(bS
, 0x0003000300030003ULL
);
629 if( edge
& mask_edge
) {
633 else if( mask_par0
) {
634 int b_idx
= 8 + 4 + edge
* (dir
? 8:1);
635 int bn_idx
= b_idx
- (dir
? 8:1);
637 bS
[0] = bS
[1] = bS
[2] = bS
[3] = check_mv(h
, b_idx
, bn_idx
, mvy_limit
);
643 for( i
= 0; i
< 4; i
++ ) {
644 int x
= dir
== 0 ? edge
: i
;
645 int y
= dir
== 0 ? i
: edge
;
646 int b_idx
= 8 + 4 + x
+ 8*y
;
647 int bn_idx
= b_idx
- (dir
? 8:1);
649 if( h
->non_zero_count_cache
[b_idx
] |
650 h
->non_zero_count_cache
[bn_idx
] ) {
655 bS
[i
] = check_mv(h
, b_idx
, bn_idx
, mvy_limit
);
659 if(bS
[0]+bS
[1]+bS
[2]+bS
[3] == 0)
664 // Do not use s->qscale as luma quantizer because it has not the same
665 // value in IPCM macroblocks.
666 qp
= h
->cur_pic
.qscale_table
[mb_xy
];
667 tprintf(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
);
669 filter_mb_edgev( &img_y
[4*edge
<< h
->pixel_shift
], linesize
, bS
, qp
, a
, b
, h
, 0 );
672 filter_mb_edgev ( &img_cb
[4*edge
<< h
->pixel_shift
], uvlinesize
, bS
, h
->chroma_qp
[0], a
, b
, h
, 0);
673 filter_mb_edgev ( &img_cr
[4*edge
<< h
->pixel_shift
], uvlinesize
, bS
, h
->chroma_qp
[1], a
, b
, h
, 0);
674 } else if( (edge
&1) == 0 ) {
675 filter_mb_edgecv( &img_cb
[2*edge
<< h
->pixel_shift
], uvlinesize
, bS
, h
->chroma_qp
[0], a
, b
, h
, 0);
676 filter_mb_edgecv( &img_cr
[2*edge
<< h
->pixel_shift
], uvlinesize
, bS
, h
->chroma_qp
[1], a
, b
, h
, 0);
682 filter_mb_edgeh(&img_y
[4*edge
*linesize
], linesize
, bS
, qp
, a
, b
, h
, 0);
684 filter_mb_edgech(&img_cb
[4*edge
*uvlinesize
], uvlinesize
, bS
, h
->chroma_qp
[0], a
, b
, h
, 0);
685 filter_mb_edgech(&img_cr
[4*edge
*uvlinesize
], uvlinesize
, bS
, h
->chroma_qp
[1], a
, b
, h
, 0);
688 filter_mb_edgeh(&img_y
[4*edge
*linesize
], linesize
, bS
, qp
, a
, b
, h
, 0);
691 filter_mb_edgeh (&img_cb
[4*edge
*uvlinesize
], uvlinesize
, bS
, h
->chroma_qp
[0], a
, b
, h
, 0);
692 filter_mb_edgeh (&img_cr
[4*edge
*uvlinesize
], uvlinesize
, bS
, h
->chroma_qp
[1], a
, b
, h
, 0);
693 } else if ((edge
&1) == 0) {
694 filter_mb_edgech(&img_cb
[2*edge
*uvlinesize
], uvlinesize
, bS
, h
->chroma_qp
[0], a
, b
, h
, 0);
695 filter_mb_edgech(&img_cr
[2*edge
*uvlinesize
], uvlinesize
, bS
, h
->chroma_qp
[1], a
, b
, h
, 0);
703 void ff_h264_filter_mb( H264Context
*h
, int mb_x
, int mb_y
, uint8_t *img_y
, uint8_t *img_cb
, uint8_t *img_cr
, unsigned int linesize
, unsigned int uvlinesize
) {
704 const int mb_xy
= mb_x
+ mb_y
*h
->mb_stride
;
705 const int mb_type
= h
->cur_pic
.mb_type
[mb_xy
];
706 const int mvy_limit
= IS_INTERLACED(mb_type
) ? 2 : 4;
707 int first_vertical_edge_done
= 0;
709 int chroma
= !(CONFIG_GRAY
&& (h
->flags
&CODEC_FLAG_GRAY
));
710 int qp_bd_offset
= 6 * (h
->sps
.bit_depth_luma
- 8);
711 int a
= h
->slice_alpha_c0_offset
- qp_bd_offset
;
712 int b
= h
->slice_beta_offset
- qp_bd_offset
;
715 // and current and left pair do not have the same interlaced type
716 && IS_INTERLACED(mb_type
^h
->left_type
[LTOP
])
717 // and left mb is in available to us
718 && h
->left_type
[LTOP
]) {
719 /* First vertical edge is different in MBAFF frames
720 * There are 8 different bS to compute and 2 different Qp
722 DECLARE_ALIGNED(8, int16_t, bS
)[8];
726 int mb_qp
, mbn0_qp
, mbn1_qp
;
728 first_vertical_edge_done
= 1;
730 if( IS_INTRA(mb_type
) ) {
731 AV_WN64A(&bS
[0], 0x0004000400040004ULL
);
732 AV_WN64A(&bS
[4], 0x0004000400040004ULL
);
734 static const uint8_t offset
[2][2][8]={
736 {3+4*0, 3+4*0, 3+4*0, 3+4*0, 3+4*1, 3+4*1, 3+4*1, 3+4*1},
737 {3+4*2, 3+4*2, 3+4*2, 3+4*2, 3+4*3, 3+4*3, 3+4*3, 3+4*3},
739 {3+4*0, 3+4*1, 3+4*2, 3+4*3, 3+4*0, 3+4*1, 3+4*2, 3+4*3},
740 {3+4*0, 3+4*1, 3+4*2, 3+4*3, 3+4*0, 3+4*1, 3+4*2, 3+4*3},
743 const uint8_t *off
= offset
[MB_FIELD
][mb_y
&1];
744 for( i
= 0; i
< 8; i
++ ) {
745 int j
= MB_FIELD
? i
>>2 : i
&1;
746 int mbn_xy
= h
->left_mb_xy
[LEFT(j
)];
747 int mbn_type
= h
->left_type
[LEFT(j
)];
749 if( IS_INTRA( mbn_type
) )
752 bS
[i
] = 1 + !!(h
->non_zero_count_cache
[12+8*(i
>>1)] |
753 ((!h
->pps
.cabac
&& IS_8x8DCT(mbn_type
)) ?
754 (h
->cbp_table
[mbn_xy
] & (((MB_FIELD
? (i
&2) : (mb_y
&1)) ? 8 : 2) << 12))
756 h
->non_zero_count
[mbn_xy
][ off
[i
] ]));
761 mb_qp
= h
->cur_pic
.qscale_table
[mb_xy
];
762 mbn0_qp
= h
->cur_pic
.qscale_table
[h
->left_mb_xy
[0]];
763 mbn1_qp
= h
->cur_pic
.qscale_table
[h
->left_mb_xy
[1]];
764 qp
[0] = ( mb_qp
+ mbn0_qp
+ 1 ) >> 1;
765 bqp
[0] = ( get_chroma_qp( h
, 0, mb_qp
) +
766 get_chroma_qp( h
, 0, mbn0_qp
) + 1 ) >> 1;
767 rqp
[0] = ( get_chroma_qp( h
, 1, mb_qp
) +
768 get_chroma_qp( h
, 1, mbn0_qp
) + 1 ) >> 1;
769 qp
[1] = ( mb_qp
+ mbn1_qp
+ 1 ) >> 1;
770 bqp
[1] = ( get_chroma_qp( h
, 0, mb_qp
) +
771 get_chroma_qp( h
, 0, mbn1_qp
) + 1 ) >> 1;
772 rqp
[1] = ( get_chroma_qp( h
, 1, mb_qp
) +
773 get_chroma_qp( h
, 1, mbn1_qp
) + 1 ) >> 1;
776 tprintf(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
);
777 { int i
; for (i
= 0; i
< 8; i
++) tprintf(h
->avctx
, " bS[%d]:%d", i
, bS
[i
]); tprintf(h
->avctx
, "\n"); }
779 filter_mb_mbaff_edgev ( h
, img_y
, linesize
, bS
, 1, qp
[0], a
, b
, 1 );
780 filter_mb_mbaff_edgev ( h
, img_y
+ 8* linesize
, linesize
, bS
+4, 1, qp
[1], a
, b
, 1 );
783 filter_mb_mbaff_edgev ( h
, img_cb
, uvlinesize
, bS
, 1, bqp
[0], a
, b
, 1 );
784 filter_mb_mbaff_edgev ( h
, img_cb
+ 8*uvlinesize
, uvlinesize
, bS
+4, 1, bqp
[1], a
, b
, 1 );
785 filter_mb_mbaff_edgev ( h
, img_cr
, uvlinesize
, bS
, 1, rqp
[0], a
, b
, 1 );
786 filter_mb_mbaff_edgev ( h
, img_cr
+ 8*uvlinesize
, uvlinesize
, bS
+4, 1, rqp
[1], a
, b
, 1 );
787 } else if (CHROMA422
) {
788 filter_mb_mbaff_edgecv(h
, img_cb
, uvlinesize
, bS
, 1, bqp
[0], a
, b
, 1);
789 filter_mb_mbaff_edgecv(h
, img_cb
+ 8*uvlinesize
, uvlinesize
, bS
+4, 1, bqp
[1], a
, b
, 1);
790 filter_mb_mbaff_edgecv(h
, img_cr
, uvlinesize
, bS
, 1, rqp
[0], a
, b
, 1);
791 filter_mb_mbaff_edgecv(h
, img_cr
+ 8*uvlinesize
, uvlinesize
, bS
+4, 1, rqp
[1], a
, b
, 1);
793 filter_mb_mbaff_edgecv( h
, img_cb
, uvlinesize
, bS
, 1, bqp
[0], a
, b
, 1 );
794 filter_mb_mbaff_edgecv( h
, img_cb
+ 4*uvlinesize
, uvlinesize
, bS
+4, 1, bqp
[1], a
, b
, 1 );
795 filter_mb_mbaff_edgecv( h
, img_cr
, uvlinesize
, bS
, 1, rqp
[0], a
, b
, 1 );
796 filter_mb_mbaff_edgecv( h
, img_cr
+ 4*uvlinesize
, uvlinesize
, bS
+4, 1, rqp
[1], a
, b
, 1 );
800 filter_mb_mbaff_edgev ( h
, img_y
, 2* linesize
, bS
, 2, qp
[0], a
, b
, 1 );
801 filter_mb_mbaff_edgev ( h
, img_y
+ linesize
, 2* linesize
, bS
+1, 2, qp
[1], a
, b
, 1 );
804 filter_mb_mbaff_edgev ( h
, img_cb
, 2*uvlinesize
, bS
, 2, bqp
[0], a
, b
, 1 );
805 filter_mb_mbaff_edgev ( h
, img_cb
+ uvlinesize
, 2*uvlinesize
, bS
+1, 2, bqp
[1], a
, b
, 1 );
806 filter_mb_mbaff_edgev ( h
, img_cr
, 2*uvlinesize
, bS
, 2, rqp
[0], a
, b
, 1 );
807 filter_mb_mbaff_edgev ( h
, img_cr
+ uvlinesize
, 2*uvlinesize
, bS
+1, 2, rqp
[1], a
, b
, 1 );
809 filter_mb_mbaff_edgecv( h
, img_cb
, 2*uvlinesize
, bS
, 2, bqp
[0], a
, b
, 1 );
810 filter_mb_mbaff_edgecv( h
, img_cb
+ uvlinesize
, 2*uvlinesize
, bS
+1, 2, bqp
[1], a
, b
, 1 );
811 filter_mb_mbaff_edgecv( h
, img_cr
, 2*uvlinesize
, bS
, 2, rqp
[0], a
, b
, 1 );
812 filter_mb_mbaff_edgecv( h
, img_cr
+ uvlinesize
, 2*uvlinesize
, bS
+1, 2, rqp
[1], a
, b
, 1 );
819 for( dir
= 0; dir
< 2; dir
++ )
820 filter_mb_dir(h
, mb_x
, mb_y
, img_y
, img_cb
, img_cr
, linesize
, uvlinesize
, mb_xy
, mb_type
, mvy_limit
, dir
? 0 : first_vertical_edge_done
, a
, b
, chroma
, dir
);
822 filter_mb_dir(h
, 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);
823 filter_mb_dir(h
, mb_x
, mb_y
, img_y
, img_cb
, img_cr
, linesize
, uvlinesize
, mb_xy
, mb_type
, mvy_limit
, 0, a
, b
, chroma
, 1);